【问题标题】:Recursion limit gives error in factorial function递归限制在阶乘函数中产生错误
【发布时间】:2017-09-19 23:04:20
【问题描述】:
import sys

num = long(raw_input("Enter the number for the factorial -> "))
sys.setrecursionlimit(num + 1)


def fact(n):
    if n == 0 or n == 1:
        return 1
    else:
        return (n * fact(n - 1))


print fact(long(num))

以上是我用于查找阶乘的代码,由于最大递归限制深度为“997”,我尝试使用以下方法进行更改:-

导入系统
sys.setrecursionlimit()

但它仍然给出错误。我还能做什么?

【问题讨论】:

  • 递归限制不是一门精确的科学;堆栈不仅仅是正在执行的 Python 函数。您需要增加开销。

标签: python recursion


【解决方案1】:

调用帧也很重要。对于fact(10),您需要 11 帧。传入一个long 整数会导致一些额外的工作进一步进行,需要另一个框架。将两个加到计数中:

sys.setrecursionlimit(num + 2)

如果您有其他框架调用调用fact() 函数的代码,请添加更多。请注意,首先在输入上调用long() 确实没有意义;如果需要,Python 会自动生成一个long 对象。

也就是说,我不喜欢递归限制。将它设置为一个较高的值一次,也许,但不要一直调整它。

一个更好的主意是不使用递归

def fact(n):
    num = 1
    while n > 1:
        num *= n
        n -= 1
    return num

或者更好的是,不要重新发明轮子,而是使用math.factorial()。从 Python 3.2 开始,Python 实现使用binary split factorial algorithm(加上一个表,用于前 21 个左右的结果)。

【讨论】:

  • 要运行示例中的代码,您还需要为long 增加一帧(这就是神秘帧的来源)。
  • @JaredGoguen:不,因为在调用fact() 之前long() 已经返回。
  • @JaredGoguen:啊,但是当值被转换时,这确实与其他地方的堆栈混为一谈。我可以使用long100 = 100L 然后sys.setrecursionlimit(101)fact(long100) 进行复制。
【解决方案2】:
import sys

num = long(raw_input("Enter the number for the factorial -> "))
sys.setrecursionlimit(num + 1)


def fact(n):
    if n == 0 or n == 1:
        return 1
    else:
        return (n * fact(n - 1))


print
print "Factorial is -> ", fact(int(num))

这很好用,我们可以增加限制 > 997

【讨论】:

  • 抱歉,您只能将一个的答案标记为已接受,不能同时标记两者。如果您觉得自己的帖子应该有接受标记,那很好,选择是您自己的。
猜你喜欢
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2021-01-25
  • 2017-05-07
相关资源
最近更新 更多