基本上我正在尝试创建一个函数r_sum(n),它将返回第一个" n"的总和。倒数:例如sum(5)= 1 + 1/2 + 1/3 + 1/4 + 1/5。我是递归的新手,我遇到了实施问题。这是我到目前为止的代码:
def r_sum(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return 1/n
我想我已经创建了函数的基础,但是我不确定函数调用本身的位置。截至目前,我意识到该函数只返回1 / n的值。我如何添加这个以便我有函数调用自己来计算这个总和?
答案 0 :(得分:4)
想一想:
sum(5) = 1 + 1/2 + 1/3 + 1/4 + 1/5
为:
sum(5) = 1/5 + sum(4)
sum(4) = 1/4 + sum(3)
sum(3) = 1/3 + sum(2)
sum(2) = 1/2 + sum(1)
sum(1) = 1
因此:
sum(x) = 1/x + sum(x-1)
sum(1) = 1
因此最后一个案例应该是:
return 1/n + sum_to(n - 1)
答案 1 :(得分:2)
尝试考虑解决问题的一部分,以便其余部分是同一问题的另一个实例,仅用于较小的块。
def sum_to(n):
if n == 0:
return 0.0
elif n == 1:
return 1.0
else:
return 1.0/n + sum_to(n-1)
答案 2 :(得分:1)
这些数字更为人所知Harmonic Numbers。值得注意的是,H 0 通常不是定义的,但这不是重点。
您希望sum_to(n)
返回什么?你可能期望1/n + 1/(n-1) + ...
对吗?所以我们不应该简单地回归1/n
。您应该查看该表达式的其余部分,并找到可以找到sum_to(n - 1)
的位置。
答案 3 :(得分:0)
编写递归函数时,需要做两件事:
此处,您的止案是0.我们知道sum_to(0) == 0
一般情况是:sum_to(n) == 1.0/n + sum_to(n - 1)
。
剩下要做的就是在功能中加入这些:
def sum_to(n):
if n == 0:
return 0
return 1.0/n + sum_to(n - 1)
答案 4 :(得分:0)
使用生成器是Pythonic(而不是迂腐)解决这个问题的方法。
def g_sum(n):
"""
Solution using generators instead of recursion.
Input validation suppressed for clarity.
"""
return sum(1/x for x in range(1, n+1))
def r_sum(n):
"""
Recursive solution proposed by @Alfe
"""
return 0 if n == 0 else 1/n + r_sum(n-1)
定时功能显示发电机解决方案约为。快两倍:
%timeit -n 10000 v1 = g_sum(100)
10000 loops, best of 3: 9.94 µs per loop
%timeit -n 10000 v2 = r_sum(100)
10000 loops, best of 3: 22 µs per loop
此外,递归实现将很快达到递归限制,这使得它对于实际使用非常不切实际。
具体来说:r_sum(1000)
因RecursionError: maximum recursion depth exceeded in comparison
答案 5 :(得分:0)
你可以用两种方式做到这一点
def r_sum(n):
if n == 1:
return 1
return (1/n) + r_sum(n-1)
或
def r_sum(n):
return sum(map(lambda x:1.0/x, xrange(1, n+1)))