【问题标题】:Python 3 Recursion - Maximum Depth ExceededPython 3 递归 - 超过最大深度
【发布时间】:2016-07-09 20:25:12
【问题描述】:

我正在编写一个基本的递归函数,它接受一个整数 n,并返回前 n 个倒数的和。输入 2 应该得到 1.5,输入 0 应该返回 0。

sum_to(2) = (1 + 1/2) = 1.5

这是我所拥有的:

def sum_to(n):
    if n>0:
        return sum_to(1+1/n) # Not sure if this is correct
    return 0

但我得到的只是超出了最大递归深度。我知道我可以列出来解决这个问题,但递归真的很有趣,我想找到一个使用它的解决方案。

【问题讨论】:

  • "不确定这是否正确" 你应该这样做。根据您的程序 sum_to(1) 与 1 + sum_to(1) 相同。你不确定这是否正确?
  • 这是否与您的问题有关? stackoverflow.com/questions/31323495/…
  • 如果你一直加1,n会永远等于0吗?
  • return sum_to(n-1) + 1 / n if n > 0 else 0
  • 不要将您的return 0 更改为print 0;现在当 n 达到 0 时,您的函数将返回 None 并且添加将失败。您需要从每个条件中返回一个数字。 (所以只需撤消该编辑:))

标签: python python-3.x recursion


【解决方案1】:

追踪它,看看你是否达到了最终条件:

(PS:在我写这篇文章的时候,问题的代码是return 1 + sum_to(1/n)

sum_to(2):
    n is 2, which is > 0
    call sum_to(1/2)
        n is .5, which is > 0
        call sum_to(1/.5)
            n is 2, which is > 0
            call sum_to(1/2)
...

你的函数永远不会返回。如果你有无限的时间和空间来完成计算,结果将是无限的,因为算法没有尽头。

对于你的例子,就这样写吧:

def sum_to(n):
    return 1 + 1/n

n > 2 时的预期结果是什么?这将决定如何组织工作代码。

【讨论】:

  • 谢谢,我现在看到了错误。预期结果应该是 n 个倒数之和。前任。 sum_to(2) = (1 + 1/2),其中 sum_to(3) = (1 + 1/2 + 1/3)。我错误地用错了问题的措辞。我基本上想找到倒数直到倒数为 1/n,然后停在那里。
  • 所以x 位置的任何给定术语的值都是1/x。第一个词1/1 == 1,第二个1/2,第三个1/3。所以你想要return 1/n + sum_to(n-1),因为每个术语都有一个连续的位置。这在 albertoql 的回答中得到了更好的解释。
【解决方案2】:

从问题来看,你似乎想计算

\sum_{i=1}^{n} 1/i

如果输入为0,则返回0。

请记住,在递归函数中,您需要定义一个基本情况和一个归纳子句

在你的问题中,归纳子句是:

1.0 / i + sum_of_reciprocals(i-1)

而基本情况可以设置为0i=0

鉴于此公式,带有示例的函数如下所示:

def sum_to(n):
    if n > 0:
        return sum_to(n-1) + 1.0 / n
    else:
        return 0

if __name__ == '__main__':
    print(sum_to(3))

结果是 1.83333333333。

更多关于递归函数的信息,可以从related wikipedia page开始。

【讨论】:

  • 非常感谢。简明扼要。感谢链接的 wiki 页面,当我现在创建更多练习递归时,它肯定会对我有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2022-08-07
  • 2020-07-13
相关资源
最近更新 更多