我正在编写一个基本的递归函数,它接受一个整数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
但我得到的是超出最大递归深度。我知道我可以列出来解决这个问题,但递归确实非常有趣,我想找到一个使用它的解决方案。
答案 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开始。