Python 3递归 - 超出最大深度

时间:2016-03-22 19:04:08

标签: python python-3.x recursion

我正在编写一个基本的递归函数,它接受一个整数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

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

2 个答案:

答案 0 :(得分: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?这将决定如何组织工作代码。

答案 1 :(得分:1)

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

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

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

请记住,在递归函数中,您需要定义基本案例归纳子句

在你的问题中,归纳条款是:

1.0 / i + sum_of_reciprocals(i-1)

虽然基本案例可以在0时设置为i=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开始。