python-3.x 计算1到n之和的递归函数?

dzhpxtsq  于 2023-02-06  发布在  Python
关注(0)|答案(7)|浏览(240)

这就是我的想法,我不知道为什么不起作用:

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的总和,我做错了什么?
有关此问题的***非递归***版本,请参见Sum of the integers from 1 to n

ldioqlga

ldioqlga1#

两件事:

  • 在为n计算sum时调用sum(n)对你没有多大好处,因为你会无限递归,所以return sum(n)+sum(n-1)行是不正确的;它需要n加上n - 1其他值的和,这也是有意义的,因为这就是你想要计算的。
  • 您需要为基本情况和递归情况返回一个值。

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

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

3pvhb19x2#

n==0(在您的else中)时,您忘记了return

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

twh00eeo3#

递归是计算前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
9gm1akwq

9gm1akwq4#

您可以将代码“复杂化”以:

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堆栈

kmbjn2e3

kmbjn2e35#

我认为你可以用下面的数学函数(复杂度O(1))来代替递归(复杂度O(n))

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

yhuiod9q6#

使用递归

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

sum_upto(100)
5050
icnyk63a

icnyk63a7#

请看看下面的片段关于您的要求。我当然希望这有帮助。干杯!

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

相关问题