【问题标题】:double recursion - RuntimeError: maximum recursion depth exceeded error双递归 - RuntimeError: 超出最大递归深度错误
【发布时间】:2019-07-03 14:00:13
【问题描述】:

我尝试构建一个函数如下:

a(0,m) = m+1
a(n+1,0) = a(n,1)
a(n+1,m+1) = a(n,a(n+1,m))

第一次尝试是:

def a(n,m):
    if n == 0:
        return m + 1
    elif m == 1:
        return a(n ,0)
    else:
        return a(n - 1, a(n, m - 1))

我得到了

RuntimeError: 超出最大递归深度

所以第二次尝试就是这样,我工作了。

def a(n,m):
    if n == 0:
        return m + 1
    elif m == 0:
        return a(n-1 , 1)
    else:
        return a(n - 1, a(n, m - 1))

所以问题是我不完全理解处理两个函数的哪个区别为什么第一个函数得到最大值。递归深度超出错误,第二个不是?

【问题讨论】:

  • 查看此链接youtu.be/i7sm9dzFtEI。您的第一个算法与此类似。
  • 您的第二个基本情况似乎是错误的。对于a(1, 0),它应该调用a(0, 1)。那是a(0+1, 0) = a(0, 1) = 1 + 1。我们可以看到这应该被第一个基本情况捕获。但相反,它进入了递归案例——这是你无限递归的原因。

标签: python recursion


【解决方案1】:

问题发生在以下情况:

  • n != 0(比如:x)
  • m = 0

会发生什么?

首先,n != 0,所以第一个 if 语句被跳过。

但是,m=0,所以第一个 elif 语句被接受。返回什么?

  • n 仍然不等于 0(它等于 x)
  • m 仍然等于 0

所以提出了完全相同的问题,并且过程重新开始,永远不会结束。

在你更新的代码中你要求 n-1,所以 n 会慢慢减少直到它为 0,并且第一个 if 语句被接受,之后程序终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2017-03-18
    • 2015-04-15
    • 2023-01-30
    • 2016-12-10
    • 2018-12-03
    相关资源
    最近更新 更多