【问题标题】:Python infinite recursion with formulaPython无限递归与公式
【发布时间】:2022-05-10 22:08:08
【问题描述】:
### Run the code below and understand the error messages
### Fix the code to sum integers from 1 up to k
### 

def f(k):
    return f(k-1) + k
print(f(10))

我对如何在使用递归时修复此代码感到困惑,我不断收到错误消息
[上一行重复了 995 次以上] RecursionError: 超出最大递归深度 有没有一种简单的方法可以在不使用任何 while 循环或创建多个变量的情况下解决此问题?

【问题讨论】:

  • 这个函数总是调用自己,导致无限递归。在某些时候,应该返回一个实际值。在这种情况下,需要一些 if-then-else 魔法。 ;)

标签: python-3.x recursion


【解决方案1】:

递归应该有一个termination condition,即base case。当您的变量达到该值时,不再有递归函数调用。 例如在您的代码中,

def f(k):
    if(k == 1): 
        return k
    return f(k-1) + k
print(f(10))

我们定义基本情况 1,如果您想从 n 取值的总和到 1。如果您希望总和扩展到该数字,您可以将任何其他数字(正数或负数)放在那里。例如也许你想从 n 取和到 -3,那么基本情况是 k == -3。

【讨论】:

    【解决方案2】:

    Python 没有优化的尾递归。你f函数调用k次。如果 k 是非常大的数字,那么 Python 会抛出 RecursionError。您可以通过sys.getrecursionlimit 查看递归限制,并通过sys.setrecursionlimit 进行更改。但是改变限制并不是一个好主意。您可以更改代码逻辑或模式,而不是更改。

    【讨论】:

      【解决方案3】:

      你的递归永远不会终止。你可以试试:

      def f(k):
          return k if k < 2 else f(k-1) + k
      print(f(10))
      

      【讨论】:

        【解决方案4】:

        您正在计算从 1 到 10 的所有数字的总和,它实质上返回第 10 个三角形数。例如。 the number of black circles in each triangle

        使用公式 on OEIS 将其作为您的代码。

        def f(k):
            return int(k*(k+1)/2)
        print(f(10))
        

        我们怎么知道 int() 不会破坏这个? k 和 k + 1 是相邻的数字,其中一个必须有 2 的因数,因此如果给定整数,此公式将始终返回整数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-13
          • 2018-10-16
          • 2018-12-12
          • 1970-01-01
          • 2018-01-27
          • 1970-01-01
          相关资源
          最近更新 更多