### 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魔术。 ;)
通常,递归将具有termination condition,即base case。当您的变量达到该值时,将不再有递归函数调用。
例如在您的代码中
def f(k):
if(k == 1):
return k
return f(k-1) + k
print(f(10))
如果要将值的总和从n扩展到1,我们定义基本情况1。如果希望将总和扩展到该数字,则可以在其中放置任何其他数字(正数或负数)。例如也许您想将n从n取到-3,则基本情况为k == -3。
您正在计算从1到10的所有数字的总和,实际上这将返回第十个三角数。例如。每个三角形中黑色圆圈的数量
在OEIS上使用公式可以将其作为代码。
def f(k):
return int(k*(k+1)/2)
print(f(10))
我们怎么知道int()不会破坏这一点? k和k + 1是相邻的数字,并且其中一个必须具有2的因数,因此,如果给定整数,此公式将始终返回整数。
您的递归永远不会终止。您可以尝试:
def f(k):
return k if k < 2 else f(k-1) + k
print(f(10))
Python没有优化的尾递归。您可以通过f函数调用k次。如果k是一个非常大的数字,那么Python会抛出RecursionError。您可以通过sys.getrecursionlimit查看什么是递归限制,并通过sys.setrecursionlimit进行更改。但是改变极限不是一个好主意。您无需更改即可更改代码逻辑或模式。