python中的递归求和函数?

时间:2016-03-22 20:03:02

标签: python python-3.x recursion

基本上我正在尝试创建一个函数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的值。我如何添加这个以便我有函数调用自己来计算这个总和?

6 个答案:

答案 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)))