当前位置: 首页 > 面试题库 >

Python是否优化了尾递归?

秦鸿羽
2023-03-14
问题内容

我有以下代码失败,并出现以下错误:

RuntimeError:超过最大递归深度

我试图重写此代码以允许尾递归优化(TCO)。我相信,如果发生了TCO,则该代码应该会成功。

def trisum(n, csum):
    if n == 0:
        return csum
    else:
        return trisum(n - 1, csum + n)

print(trisum(1000, 0))

我是否应该得出结论,Python不执行任何类型的TCO,还是只需要以不同的方式定义它?


问题答案:

你可以通过这样的转换来手动消除递归

>>> def trisum(n, csum):
...     while True:                     # change recursion to a while loop
...         if n == 0:
...             return csum
...         n, csum = n - 1, csum + n   # update parameters instead of tail recursion

>>> trisum(1000,0)
500500


 类似资料:
  • 我有以下代码失败,错误如下: RuntimeError:超出最大递归深度 我试图重写它以允许尾部递归优化(TCO)。我相信,如果发生了TCO,那么这段代码应该是成功的。 我应该得出结论,Python不做任何类型的TCO,还是我只需要以不同的方式定义它?

  • 本文向大家介绍Python尾递归优化实现代码及原理详解,包括了Python尾递归优化实现代码及原理详解的使用技巧和注意事项,需要的朋友参考一下 在传统的递归中,典型的模式是,你执行第一个递归调用,然后接着调用下一个递归来计算结果。这种方式中途你是得不到计算结果,知道所有的递归调用都返回。 这样虽然很大程度上简洁了代码编写,但是让人很难它跟高效联系起来。因为随着递归的深入,之前的一些变量需要分配堆栈

  • 本文向大家介绍C#中尾递归的使用、优化及编译器优化,包括了C#中尾递归的使用、优化及编译器优化的使用技巧和注意事项,需要的朋友参考一下 递归运用 一个函数直接或间接的调用自身,这个函数即可叫做递归函数。 递归主要功能是把问题转换成较小规模的子问题,以子问题的解去逐渐逼近最终结果。 递归最重要的是边界条件,这个边界是整个递归的终止条件。 上面是个经典阶乘函数的实现。这里分2步: 1.转换,把10的阶

  • 问题内容: 特别是如果我有以下代码: Swift编译器会将其优化为循环吗?在下面更有趣的情况下会这样吗? 问题答案: 最好的检查方法是检查编译器生成的汇编语言代码。我将上面的代码编译为: 输出的相关部分 生成的代码中没有任何呼叫说明,只有条件跳转(/ / / )。显然,这表明Swift确实在 两种 情况下都进行了尾部调用优化。 此外,/ 函数很有趣,因为编译器不仅似乎在执行TCO,而且还在每种情况

  • 问题内容: 我尝试在网络上进行挖掘以使问题得到解答。我找到了一些与达芬奇计划有关的文件。这被标记为与在JVM中包含闭包有关的JSR 292。这个项目实现了吗,它是Java 8的一部分吗? 问题答案: 据我所知,Java 8没有尾调用优化。Afaik与实际的编译器技巧无关,因为它很简单,但是为了安全起见保留了一个调用栈。但是我想使用字节码重写器是可能的。

  • 本文向大家介绍详解JavaScript调用栈、尾递归和手动优化,包括了详解JavaScript调用栈、尾递归和手动优化的使用技巧和注意事项,需要的朋友参考一下 调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧。 栈帧是指为一个函数调用单独分配的那部分栈空间。 当运行的程序从当前函数调用另外一个函数时,就会为下一个函数建立一个新的栈帧,并且