【问题标题】:Recursive function to calculate sum?递归函数计算总和?
【发布时间】:2013-11-26 19:01:27
【问题描述】:

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

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 的总和。我做错了什么?

【问题讨论】:

    标签: python recursion python-3.x sum


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      两件事:

      • 在为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)
      

      【讨论】:

      • 现在我将如何打印总和? @Simeon Visser
      • print sum(n) - 让sum 的返回值成为print 的参数。
      • @kiasy 是的,让sum 计算结果,然后在完成后打印它。
      【解决方案3】:

      您可以将代码复杂化到:

      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)stack 而不是nstack

      【讨论】:

        【解决方案4】:

        递归是计算第一个 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
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            使用递归

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-01-20
                • 1970-01-01
                • 2021-05-16
                • 2020-05-25
                • 1970-01-01
                • 2018-12-10
                • 1970-01-01
                • 2015-07-28
                相关资源
                最近更新 更多