首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

递归整数到罗马数字的函数在末尾变得疯狂

是指在递归过程中,函数的调用栈层级过深,导致栈溢出或者递归调用时间过长,使得函数无法正常执行或者执行效率极低。

递归是一种函数调用自身的方法,用于解决问题的一种常见算法。在整数转换为罗马数字的问题中,可以使用递归来实现。下面是一个示例的递归函数实现:

代码语言:txt
复制
def int_to_roman(num):
    if num == 0:
        return ""
    elif num >= 1000:
        return "M" + int_to_roman(num - 1000)
    elif num >= 900:
        return "CM" + int_to_roman(num - 900)
    elif num >= 500:
        return "D" + int_to_roman(num - 500)
    elif num >= 400:
        return "CD" + int_to_roman(num - 400)
    elif num >= 100:
        return "C" + int_to_roman(num - 100)
    elif num >= 90:
        return "XC" + int_to_roman(num - 90)
    elif num >= 50:
        return "L" + int_to_roman(num - 50)
    elif num >= 40:
        return "XL" + int_to_roman(num - 40)
    elif num >= 10:
        return "X" + int_to_roman(num - 10)
    elif num >= 9:
        return "IX" + int_to_roman(num - 9)
    elif num >= 5:
        return "V" + int_to_roman(num - 5)
    elif num >= 4:
        return "IV" + int_to_roman(num - 4)
    else:
        return "I" + int_to_roman(num - 1)

这个函数将一个整数转换为对应的罗马数字表示。函数通过不断递归调用自身,每次减去对应的数值,直到整数为0时停止递归。

然而,如果输入的整数过大,递归调用的层级会变得非常深,可能导致栈溢出的问题。为了解决这个问题,可以使用尾递归优化或者迭代的方式来实现整数到罗马数字的转换。

尾递归优化是指将递归调用放在函数的末尾,避免不必要的栈帧的创建和保存,从而减少内存的使用。下面是一个尾递归优化的示例实现:

代码语言:txt
复制
def int_to_roman(num, result=""):
    if num == 0:
        return result
    elif num >= 1000:
        return int_to_roman(num - 1000, result + "M")
    elif num >= 900:
        return int_to_roman(num - 900, result + "CM")
    elif num >= 500:
        return int_to_roman(num - 500, result + "D")
    elif num >= 400:
        return int_to_roman(num - 400, result + "CD")
    elif num >= 100:
        return int_to_roman(num - 100, result + "C")
    elif num >= 90:
        return int_to_roman(num - 90, result + "XC")
    elif num >= 50:
        return int_to_roman(num - 50, result + "L")
    elif num >= 40:
        return int_to_roman(num - 40, result + "XL")
    elif num >= 10:
        return int_to_roman(num - 10, result + "X")
    elif num >= 9:
        return int_to_roman(num - 9, result + "IX")
    elif num >= 5:
        return int_to_roman(num - 5, result + "V")
    elif num >= 4:
        return int_to_roman(num - 4, result + "IV")
    else:
        return int_to_roman(num - 1, result + "I")

这个函数使用一个额外的参数result来保存中间结果,每次递归调用时将结果累加到result中。这样可以避免不断创建新的栈帧,提高函数的执行效率。

除了递归和尾递归优化,还可以使用迭代的方式来实现整数到罗马数字的转换。迭代是指使用循环来代替递归调用,从而实现相同的功能。下面是一个迭代的示例实现:

代码语言:txt
复制
def int_to_roman(num):
    roman_dict = {
        1000: "M",
        900: "CM",
        500: "D",
        400: "CD",
        100: "C",
        90: "XC",
        50: "L",
        40: "XL",
        10: "X",
        9: "IX",
        5: "V",
        4: "IV",
        1: "I"
    }
    result = ""
    for value, symbol in roman_dict.items():
        while num >= value:
            result += symbol
            num -= value
    return result

这个函数使用一个字典来存储整数和对应的罗马数字表示,然后通过循环遍历字典中的键值对,将对应的罗马数字累加到结果中,直到整数为0时停止循环。

综上所述,递归整数到罗马数字的函数在末尾变得疯狂可以通过尾递归优化或者迭代的方式来解决。在实际应用中,可以根据具体的需求和性能要求选择适合的实现方式。

腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云网络(VPC):https://cloud.tencent.com/product/vpc
  • 云安全中心(SSP):https://cloud.tencent.com/product/ssp
  • 云直播(CSS):https://cloud.tencent.com/product/css
  • 云点播(VOD):https://cloud.tencent.com/product/vod
  • 人工智能开放平台(AI):https://cloud.tencent.com/product/ai
  • 物联网开发平台(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动推送(Xinge):https://cloud.tencent.com/product/xgpush
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙:https://cloud.tencent.com/solution/virtual-universe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

移除元素、分数到小数、整数转罗马数字

文章目录 移除元素 分数到小数 整数转罗马数字 移除元素 给你一个数组 nums_ 和一个值 val,你需要 原地 移除所有数值等于 val _元素,并返回移除后数组新长度。...说明: 为什么返回数值是整数,但输出答案是数组呢? 请注意,输入数组是以**「引用」**方式传递,这意味着函数里修改输入数组对于调用者是可见。...也就是说,不对实参作任何拷贝 int len = removeElement(nums, val); // 函数里修改输入数组对于调用者是可见。...// 根据你函数返回长度, 它会打印出数组中 该长度范围内 所有元素。...通常情况下,罗马数字中小数字数字右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 左边,所表示数等于大数 5 减小数 1 得到数值 4 。

55020

算法科普:什么是约瑟夫环

从编号为 k 的人开始报数,数到 m 那个人出圈;他下一个人又从 1 开始报数,数到 m 那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。...每次报数之前要判断他是否圈子内(也就是他标识是否为 1 ),如果在圈子里面才会继续报数。定义一个变量记录出圈的人数, 出圈的人数等于 n-1 时,则游戏结束。...可以将每个人看做链表单个节点,每个节点之间通过链表 next 指针连接起来,并且将链表末尾节点指向头节点就形成环,由链表构成环形结构在数据结构中称为循环链表。...有了递推公式后即可使用递归方式实现。...4.2 递归代码实现 #include int Joseph(int n,int m)/*计算约瑟夫环递归函数*/ { if(n <= 1 || m <= 1)//设置游戏人数限定值

1.1K20
  • LeetCode算法(二)

    通常情况下,罗马数字中小数字数字右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 左边,所表示数等于大数 5 减小数 1 得到数值 4 。...C 可以放在 D (500) 和 M (1000) 左边,来表示 400 和 900。 给定一个罗马数字,将其转换成整数。输入确保 1 到 3999 范围内。...循环提取每一个罗马数字。因为不同位置会有不同做法,所以记录之前罗马数字值,如果比上一次加值大,则本次减去2倍该值。 二、21....移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组末尾,同时保持非零元素相对顺序。...有效字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 字母异位词。

    42640

    LeetCode 算法题

    通常情况下,罗马数字中小数字数字右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 左边,所表示数等于大数 5 减小数 1 得到数值 4 。...题目提示: 1 <= s.length <= 15 s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M') 题目数据保证 s 是一个有效罗马数字,且表示整数范围 [1,...解题提示 通常情况下,罗马数字中小数字数字右边。若输入字符串满足该情况,那么可以将每个字符视作一个单独值,累加每个字符对应数值即可。...因为每次调用递归都会去掉 l1 或者 l2 头节点(直到至少有一个链表为空),函数 mergeTwoList 至多只会递归调用每个节点一次。...递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间大小取决于递归调用深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m次,因此空间复杂度为 O(n+m)。

    32210

    尝鲜 ES2019 新功能

    正文共:2241 字 预计阅读时间: 7 分钟 翻译:疯狂技术宅 链接:https://medium.freecodecamp.org/a-taste-of-whats-new-in-es10-68d28ba22f92...ES10/ES2019 本次更新中有很大改进。它引入了一些新函数和方法,使开发者能够编写更少代码,并提高工作效率。 让我们直接进入正题。 flat() flat() 是一种用于展平数组方法。...某些时候,数组元素还是数组,这些类型数组称为嵌套数组。 要取消数组嵌套(展平它们),我们不得不使用递归。现在引入 flat(),可以用一行代码完成。...它就像 map 一样工作,此外也使它变得扁平。...返回值 它返回一个字符串,末尾所有的空格被删除。 示例 ? 我们可以清楚地看到末尾空格被删除。

    2K40

    c++(三)

    函数: 函数调用之前必须进行声明或者定义,函数声明:返回值类型 函数名(参数类型 参数名称.......)...double x);    求余弦 double cos(double x);    求正切 double tan(double x);    反正切 double atan(double x); 7.取函数...; 递归: 函数自己调用自己,递归需要终止条件; 位运算:(对一个bit或若干个bit操作) 按位与:&   对应两个二进制位都为1时结果才为1,否则为0,如果要将short型n低8位全部置成0;n...右移:>>    a>>b:a右移b位,右移时候,低位被丢弃,高位引入与符号位保持一致,即符号位为1时,右移一,最高位也要补一,右移结果等于 左边操作数a除以2n次方,往小里取 ? ?...字符串常量所占用内存为字符个数+1 用字符数组存放字符串时候,数组元素个数至少为所存放字符串字符个数+1; 用scanf.cin获取所输入字符数组时,会自动末尾补0; ? ? ? ?

    59430

    C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数

    进阶: 你可以不使用循环或者递归,且 O(1) 时间复杂度内解决这个问题吗?...时间70ms内。...// 例如,当输入为 12321 时, while 循环末尾我们可以得到 x = 12,revertedNumber = 123, // 由于处于中位数字不影响回文(它总是与自己相等...通常情况下,罗马数字中小数字数字右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 左边,所表示数等于大数 5 减小数 1 得到数值 4 。...C 可以放在 D (500) 和 M (1000) 左边,来表示 400 和 900。 给定一个罗马数字,将其转换成整数。输入确保 1 到 3999 范围内。

    46020

    LeetCode 11-15 题 详解 Java版 ( 万字 图文详解 LeetCode 算法题11-15 =====>>> <建议收藏>)

    解法一 这个是自己解法,主要思想就是每次取出一位,然后得到相应罗马数字,然后合起来就行。...下边看一下我代码,看起来比较多 //这个函数判断 index 列字符是否完全相同 public boolean isSameAtIndex(String[] strs, int index) {...[j].length() 表明当前行已经到达末尾 * strs[j].charAt(i) !...解法三 递归 我们把原来数组分成两部分,求出左半部分最长公共前缀,求出右半部分最长公共前缀,然后求出两个结果再求最长公共前缀,就是最后结果了。...而怎么保证不加入重复 list 呢? 要记得我们 nums 已经有序了,所以只需要找到一组之后,当前指针要移到和当前元素不同地方。其次遍历数组时候,如果和上个数字相同,也要继续后移。

    13110

    LeetCode笔记:319. Bulb Switcher

    大意: 有n个灯泡初始是关着。你首先把所有灯泡打开。然后每数到两个灯泡时关闭它。第三轮,将每数到第三个灯泡时改变它状态(如果它是关着就打开,如果是打开就关闭)。...第i轮,都将每数到第i个灯泡时切换状态。第n轮,你只用切换最后一个灯泡状态。判断n轮后有多少灯泡开着。 例: 给出 n = 3。 首先,三个灯泡是 [关,关,关]。...其实第一轮全开就是每数到一个灯泡时就转换状态。也就是说,对于每个灯泡而言,第i轮,只要i是它约数,都会让它转换一次状态。初始状态是关,所以要想最后状态是开,那么就需要转换奇数次状态。...所以只有那些平方数,额外拥有一次单次转换次数,比如4是22,9是33,这些数字遇到2、3时候都会额外单独转换一次,那最后就一定是关着,所以我们目的变成了找1到n中平方数个数。...所以1R之间有多少个数,就表示最后又多少个灯泡是开着! 所以问题变得很简单,对n开平方根取就行了!

    22330

    一行代码居然能解决这么多曾经困扰我半天算法题

    鉴于有些人把这道题忘了,我还是把这道题描述贴出来一下吧 问题描述:编号为 1-N N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 士兵会被杀死出列...我们定义递归函数 f(n,m) 返回结果是存活士兵编号,显然当 n = 1 时,f(n, m) = 1。...假如我们能够找出 f(n,m) 和 f(n-1,m) 之间关系的话,我们就可以用递归方式来解决了。我们假设人员数为 n, 报数到 m 的人就自杀。...这样,我们就得出 f(n, m) 与 f(n - 1, m)之间关系了,而 f(1, m) = 1.所以我们可以采用递归方式来做。...四、n 阶乘 问题描述:给定一个整数 N,那么 N 阶乘 N! 末尾有多少个 0?例如:N = 10,则 N!= 3628800,那么 N! 末尾有两个0。

    59320

    JavaScript数组排序总结

    工作中经常用到几种排序方式,整理出来分享给大家。 ---- 1、array排序函数sort  使用Arraysort方法。...,将比较大(较小)数通过两两比较移动到数组末尾(开始),执行一遍内层循环,确定一个最大(最小)数,外层循环从数组末尾(开始)遍历到开始(末尾)。...,将一个数组排序问题看成是两个小数组排序问题,而每个小数组又可以继续看成更小两个数组,一直递归下去,直到数组长度大小最大为2。...,如果是浮点数,则向下取 var newValue=arr.splice(num,1);//找到中间数值 var left=[],right=[]; for(var...quickSort(left).concat(newValue,quickSort(right));//递归不断重复比较 } console.log(quickSort(arr)) /

    37810

    谷歌与递归

    调用通常发生在彼此不同函数之间。其实,函数还有一种特殊调用方式,那就是自己调用自己,这种方式称为函数递归调用。递归程序设计中也是一个常用技巧,甚至是一种思维方式,非常值得我们掌握。...程序设计领域,递归是指函数(或方法)直接或间接调用自身一种操作,如下图所示。递归调用好处在于,它能够大大减少代码量,将原本复杂问题简化成一个简单基础操作来完成。...在编写程序过程中,“递归调用”是一个非常实用技巧。 ? 递归示意图 从上图中可以看出,函数不论是直接调用自身,还是间接调用自身,都是一种无终止过程。 程序设计中,显然不能出现这种无终止调用。...答案并不复杂,利用递归可以使算法逻辑变得非常简单。因为递归过程每一步用都是同一个算法,计算机只需要自顶向下不断重复即可。 具体到阶乘计算,无非就是某个数字n阶乘,变成这个数乘以n-1阶乘。...我们假定数到20有F(20)种不同路径,那么到达20这个数字,前一步只有两个可能情况,即从18直接跳到20,或者从19数到20。

    45520

    一种避免递归查询树状数据表设计与实现

    但是当业务需求变得多了,数据量庞大了,这样方式就不再适合用于生产。...尽管mysql8.0支持了 cte(公共表表达式),递归效率比传统递归方式有明显提升,但是查询效率仍会随着部门树层级深度提高而变差。...日常中,可能会经常使用上述类似方法去解决类似的问题,但我觉得这样方法效率上不是最优解。于是乎开始查找更好方案去解决这些问题。| 要不试试这个方法?...实际中可以用大于小于*/完美~查询子孙部门总数到这里可能会说,需求1都解决了,查总数自然也就解决了,直接上select count就可以了,确实没有错,但是没有那个必要,因为有个简单公式可以直接计算。...,后面只需要递归即可*//*递归函数 示例*/let recursive = (_list, parent_id = null) => {    let _tree = [];    _list.forEach

    1.2K52

    C++ 内存对齐 及 &引用是否真的节省内存一点思考

    :32385,第一个k地址 0x61fdcc,k地址间隔 6410(参数个数为1-4个) ---- 增加参数个数到(5-6个): 递归次数:25908,第一个k地址 0x61fdbc(比上面移动了...16),k地址间隔 8010 增加参数个数到(7-8个): 递归次数:21589,第一个k地址 0x61fdac(比上面移动了32),k地址间隔 9610 增加参数个数到(9-10个): 递归次数...操作系统、编译器不同情况下结果有差异情况,采用 linux 进行测试 linux中测试结果: 传入2个int: 递归次数174522 传入2个int&:递归次数130885 传入2个double...,你使用引用时候,传给你是它里面指针所指向内容。...所以对这种内置变量类型,函数调用时候,直接使用copy传入就可以了,还比较省内存(int 4字节,使用 int & 会占用 8字节) 至此,可以解释上面 LeetCode 那道题,传入 int &

    96320

    动态规划解决约瑟夫环问题

    从编号为0的人开始报数,数到m那个人出列;他下一个人又从1开始报数,数到m那个人又出列;依此规律重复下去,求最后一个出列的人。...1.经典解法 可以用链表来模拟约瑟夫环,每次链表中删除第m个节点,然后不断,直至链表中只剩下一个节点。最后一个这个节点就是我们要求节点。 注意:当迭代器扫描到链表末尾时,将迭代器移至链表头。...++cur; if(cur==numbers.end()) //迭代器扫描到链表末尾时,将迭代器移至链表头...状态就是确定问题表达式,状态转移方程就是上一阶段问题解推出当前阶段问题解递推式。 针对约瑟夫环问题,n个元素环可以定义为f(n,m),m表示每次移动步数。则状态就是f(n,m)。...1n>1 f(n,m)=\begin{cases} 0&\text{n=1}\\ (f(n-1,m)+m)\%n & \text{n>1}\end{cases} 有了状态转移方程,我们可以使用迭代或者递归来完成问题求解

    1.1K20

    JavaScript基本入门教程

    局部变量:只能在方法中起作用,出了方法,就不起作用了,但是,有一点必须注意,那就是方法中没有代码块概念,也就是说,方法代码块中定义局部变量,整个方法中都是可以使用,不限于代码块中。...自定义函数三种方式: 定义命名函数 定义匿名函数 使用Function类匿名函数(了解) 递归函数 A.定义命名函数 定义格式: function 函数名 (参数列表) { // 函数体 }...标签中允许先调用函数,再定义函数,但是不同...标签中,只能调用前面的......; D.递归函数 代码案例: <!...类属性:类属性是类属性,只有通过类名来调用,无法通过对象来调用,对象调用时候就会出现undefined。 局部变量:函数内可用,出了函数就不可用。

    4.1K20

    约瑟夫环问题

    以前写程序,今天整理文件时候发现了,贴出来有需要朋友可以参考! 问题提出: 约瑟夫环是一个数学应用问题:已知n个人(以编号0,2,3...n-1分别表示)围坐在一张圆桌周围。...从编号为k的人开始报数,数到m那个人出列;他下一个人又从1开始报数,数到m那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 解决方案: 约瑟夫环有递归和非递归两种解决方案。 1....非递归可用数组和循环链表来解决。...int[] result = new int[total];//定义存储出列顺序数组 int count = 0;//定义出列计数器 //people...递归函数。先来看一下递归函数: 为了简化问题,我们假设k=0,设f(n,m,i)为n个人环,报数为m,第i个人出环编号 当i=1时,f(n,m,i) = (m-1)%m 当i!

    63720

    如何实现比 setTimeout 快 80 倍定时器?

    () 每调用一次定时器最小间隔是 4ms,这通常是由于函数嵌套导致(嵌套层级达到一定深度)。...= 'zero-timeout-message'; // 保持 setTimeout 形态,只接受单个函数参数,延迟始终为 0。...作者设计了一个实验方法,就是分别用 postMessage 版定时器和传统定时器做一个递归执行计数函数操作,看看同样计数到 100 分别需要花多少时间。读者也可以在这里自己跑一下测试。...} else { setTimeout(test2, 0); } } } 实验代码很简单,先通过 setZeroTimeout 也就是 postMessage 版本来递归数到...直接放结论,这个差距不固定, mac 上用无痕模式排除插件等因素干扰后,以计数到 100 为例,大概有 80 ~ 100 倍时间差距。我硬件更好台式机上,甚至能到 200 倍以上。

    18240
    领券