【问题标题】:Why am I getting this error for maximum recursive calls?为什么最大递归调用会出现此错误?
【发布时间】:2021-10-28 20:47:29
【问题描述】:

我很想以递归方式将数组中的值相乘,但运行以下代码后出现错误:

def multAll(k,A) : 
    multAllRec(k,A,0)
def multAllRec(k,A,i) : 
    if i<len(A):
        A[i] *= k
    multAllRec(k, A, i + 1)

multAll(10,[5,12,31,7,25])

错误:RecursionError:调用 Python 对象时超出最大递归深度

【问题讨论】:

  • 您需要添加一个基本案例才能在某个时候返回。 multAllRec 的每次调用都保证会再次调用自身,因此您将始终达到极限。看起来你想要类似if i &gt;= len(A): return 的东西
  • 顺便说一句,你可以通过给i一个默认值来组合这两个功能。
  • 您正面临堆栈溢出(如论坛名称)。正如洛克所说,您正在递归调用函数multAllRec 而没有返回,这就是导致错误的原因。
  • 谢谢,我修改了函数,使其包含def multAll(k,A): return multAllRec(k,A,0) def multAllRec(k,A,i): if i &gt;= len(A): return A
  • 因为multAllRec() 无条件地调用自己。这需要有条件地完成才能停止这样做。

标签: python recursion


【解决方案1】:

你应该对returnvalue 做点什么。在 at 列表中使用 Conditional 语句来防止 无限循环 递归调用。

def multAll(k,A) :
    multAllRec(k,A,0)
    return A

def multAllRec(k,A,i) :
    if i<len(A):
        A[i] *= k
        multAllRec(k, A, i + 1)
    else:
        return A    
    

B=multAll(10,[5,12,31,7,25])

print(B)

[输出]

[50, 120, 310, 70, 250]

【讨论】:

    【解决方案2】:

    你可以这样使用:

    def mult_all_rec(k, A, i=0):
        if i < len(A):
            A[i] *= k
            mult_all_rec(k, A, i + 1)
        return
    
    
    some_list = [5, 12, 31, 7, 25]
    mult_all_rec(10, some_list)
    
    print(some_list)
    

    这里不需要multAll方法,这个递归可以通过给i赋值一个默认值0来完成。(如def mult_all_rec(k, A, i=0):

    如果不是 i return。这称为base condition

    每个递归都必须有一个base condition

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-30
      • 2013-11-03
      • 2015-03-02
      • 2021-08-04
      • 2014-07-04
      • 2021-03-29
      相关资源
      最近更新 更多