【问题标题】:Unexpected reaching maximal recursion depth in Python在 Python 中意外达到最大递归深度
【发布时间】:2017-10-11 11:36:20
【问题描述】:
N=3
pre_calc=["-1" for i in range (N+2)]
def calc(i) :
    if(pre_calc[i] =="-1"):
        if i==0:
             pre_calc[i] ="a[0]"
        elif i==N+1:
            pre_calc[i]= "a[N+1]"
        else:
            pre_calc[i] ="("+str(calc(i-1))+"+"+str(calc(i+1))+")/2-c["+str(i)+"]"
    return pre_calc[i] ;
ans=calc(1)
print (ans) 

我正在求解递归 a[i] =(a[i-1]+a[i+1])/2-c[i],其中 c[i], a[0] 和 a[N+ 1]。那是 Timus 的问题 1047。 因此,为了理解这种重复,我决定编写一个程序,它会根据 a[0]、a[N+1] 和 c[i] 输出 a[1] 的表达式。
我做到了。 点它绝对行不通! 我想知道为什么即使 N 为 2 也会超过堆栈深度限制。

【问题讨论】:

    标签: python recursion stack depth recurrence


    【解决方案1】:

    calc(1) 调用calc(2)(i + 1 调用),它调用calc(1)(i - 1 调用),它调用calc(2),它调用calc(1),它调用calc(2) ...

    【讨论】:

    • 为什么不是这样? N=2。计算(1)=计算(0)+计算(2)=a[0]+(计算(1)+计算(3)) /2-c[1]=a[0]+(计算(0)+ calc(2)+a[3])/2-c[1]=a[0]+(a[0]+(calc(1)+a[3])/2-c[1]+a[ 3])/2-c[1]...哦,不错!!!我现在明白了,问题出在哪里。谢谢。
    • @NikitaMahilewets 没问题,如果问题得到解答,请考虑通过选择旁边的绿色复选标记来接受答案。
    【解决方案2】:

    递归方法和函数对程序来说是非常非常危险的,如果你将calc函数重写为非递归风格,你就可以摆脱这个问题。

    当你不必使用递归方法时,永远不要使用

    伊迪丝:

    如果您确定 func 的最大深度和最大深度值不是很高(低于深度限制),当然可以使用 func。但是如果您不知道最大深度,请不要使用它,因为它会杀死您的程序。

    例如 recursive factorial func 太危险了,因为这个 func 的最大深度可能高于 dept 限制。

    【讨论】:

    • 电力非常危险。如果没有必要,永远不要使用它。使用蜡烛。
    • 是的。电可以用高压杀死人,递归方法可以用stackoverflow杀死程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多