递归函数计算总和?

时间:2013-11-13 23:04:02

标签: python recursion python-3.x sum

这就是我所拥有的,我不确定为什么它不起作用

def sum(n):
    if (n>0):
        print (n)
        return sum(n)+sum(n-1)
    else:
        print("done doodly")

number = int(input(":  "))
sum(number)

例如,如果使用输入5,我想编程计算5 + 4 + 3 + 2 + 1的总和。我做错了什么?

7 个答案:

答案 0 :(得分:3)

两件事:

  • 在为sum(n)计算sum时调用n对您没有多大帮助,因为您将无限期地递归。所以行return sum(n)+sum(n-1)不正确;它必须是n加上n - 1个其他值的总和。这也是有意义的,因为这就是你想要计算的东西。
  • 您需要为基本案例和递归案例返回一个值。

因此,您可以将代码简化为:

def sum(n):
    if n == 0:
        return 0
    return n + sum(n - 1)

答案 1 :(得分:1)

return(在n==0中)

忘记了else
>>> def Sum(n):
...   if not n:
...     return 0
...   else:
...     return n + Sum(n-1)
... 
>>> Sum(5)
15

答案 2 :(得分:0)

您可以代码复杂化为:

def my_sum(n, first=0):
    if n == first:
        return 0
    else:
        return n + my_sum(n-1, (n+first)//2) + my_sum((n+first)//2, first)

优点是现在只使用log(n)堆栈而不是n堆栈

答案 3 :(得分:0)

递归是计算前n个数之和的错误方法,因为你让计算机进行n计算(这在O(n)时间运行。)这是一种浪费。

您甚至可以将sum()函数与range()一起使用,但尽管此代码看起来很干净,但仍然可以在O(n)中运行:

>>> def sum_(n):
...     return sum(range(1, n+1))
...
>>> sum_(5)
15

相反递归我建议使用arithmetic series之和的等式,因为它在O(1)时间内运行:

>>> def sum_(n):
...     return (n + n**2)//2
...
>>> sum_(5)
15

答案 4 :(得分:0)

我认为你可以使用下面的数学函数(复杂度O(1))而不是使用递归(复杂度O(n))

def sum(n):
    return (n*(n+1))/2

答案 5 :(得分:0)

使用递归

def sum_upto(n):
  return n + sum_upto(n-1) if n else 0

sum_upto(100)
5050

答案 6 :(得分:0)

请查看以下关于您的请求的片段。我当然希望这会有所帮助。干杯!

def recursive_sum(n):
    return n if n <= 1 else n + recursive_sum(n-1)

# Please change the number to test other scenarios.
num = 100

if num < 0:
   print("Please enter a positive number")
else:
   print("The sum is",recursive_sum(num))