马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
>>> def f(x):
if x > 0:
return x + f( x - 1)
else:
return 0
>>> print(f(100))
5050
设置else返回值,能正常运行
>>> print(f(100))
5050
>>> def f(x):
if x > 0:
return x + f( x - 1)
>>> print(f(100))
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
print(f(100))
File "<pyshell#13>", line 3, in f
return x + f( x - 1)
File "<pyshell#13>", line 3, in f
return x + f( x - 1)
File "<pyshell#13>", line 3, in f
return x + f( x - 1)
[Previous line repeated 97 more times]
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
>>>
删去返回值,立即报错,return 0 在终止递归中起了什么作用
在递归中,当函数调用自身时,每次调用都会创建一个新的函数调用帧(function call frame),包含了函数的局部变量和执行的位置。当递归到达终止条件时,也就是x不大于0时,没有更多的递归调用,程序将开始回溯(backtrack)并返回到之前的调用帧。
在你提供的示例代码中,如果没有设置else的返回值,当x不大于0时,函数没有明确的返回值,这将导致函数返回None。然后,在递归的回溯过程中,当尝试执行 return x + f(x - 1) 时,由于f(x - 1)返回的是None,将会出现无法将int类型和NoneType类型相加的错误。
因此,设置else的返回值为0是为了确保在递归的回溯过程中,当x不大于0时,返回一个合适的值,使得递归能够正常终止并返回正确的结果。
|