在函数体内调用自身称为函数递归。函数递归涉及一个隐式循环,该循环在没有循环控制的情况下重复一段代码。
例如,有以下数学问题。已知有一个序列:f(0) = 1, f(1) = 4, f(n + 2) = 2*f(n+ 1) +f(n),其中n是大于的整数0,求f(10)值。这个问题可以用递归来解决。下面的程序将定义一个 fn() 函数来计算 f(10) 的值。
def fn(n) :
if n == 0 :
return 1
elif n == 1 :
return 4
else :
# 函数中调用它自身,就是函数递归
return 2 * fn(n - 1) + fn(n - 2)
# 输出fn(10)的结果
print("fn(10)的结果是:", fn(10))
fn() 函数在上面的 fn() 函数体中再次被调用,也就是函数递归。注意 fn() 函数体中对 fn 的调用形式:
return 2 * fn(n - 1) + fn(n - 2)
对于 fn(10),它等于 2*fn(9)+fn(8),其中 fn(9) 等于 2*fn(8)+fn(7)... 以此类推,它将最终计算到 fn(2) 等于 2*fn(1)+fn(0),即 fn(2) 是可计算的,这样递归带来的隐式循环就会结束,然后反过来一路回来,最后fn可以得到(10)的值。
仔细看上面的递归过程,当一个函数不断调用自己时,函数的返回值必须在某个时刻确定,即不再调用自己:否则,这个递归就变成了无限递归,类似于无限循环。因此,定义递归函数时有一条最重要的规则:递归必须沿已知方向进行。
比如上面的数学题改成这个。已知有一个序列:f(20)=1, f(21)=4, f(n + 2)=2*f(n+1)+f(n),其中n为更大的整数大于 0,求 f(10) 的值。那么 f(10) 的函数体应该改成如下形式:
def fn(n) :
if n == 20 :
return 1
elif n == 21 :
return 4
else :
# 函数中调用它自身,就是函数递归
return fn(n + 2) - 2*fn(n + 1)
由上面的fn()函数可知,当程序要计算fn(10)的值时,fn(10)等于fn(12)-2*fn(11),fn(11)等于fn (13)- 2*fn(12)... 以此类推,直到 fn(19) 等于 fn(21)-2*fn(20),则可以得到 fn(19) 的值,而然后反向计算到 fn(10) ) 值。这是递归的重要规则:对于 fn(10),如果 fn(0) 和 fn(1) 已知,则 fn(n)=2*fn(n-1)+fn(n-2) 是递归的因为小端是已知的;如果 fn(20) 和 fn(21) 已知,则 fn(n)=fn(n+2)-2*fn(n +1) 形成递归,因为大端已知。
递归非常有用。比如程序要遍历某个路径下的所有文件,但是这个路径下的文件夹深度是未知的,所以可以使用递归来实现这个需求。系统可以定义一个函数,接收一个文件路径作为参数,该函数可以遍历当前路径下的所有文件和文件路径,即在函数的函数体中再次调用函数本身,处理其中的所有文件路径路径。
总之,只要在函数的函数体中调用函数本身,就是函数递归。递归必须沿已知方向进行。
python学习网,大量的免费
,欢迎在线学习!
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python有辅助函数吗?01/10
- ♥ 什么是 python27.dll10/06
- ♥ python可以在哪里运行10/10
- ♥ 如何判断python中的两个列表是否相同08/18
- ♥ 安装anaconda后cmd无法运行python怎么办09/12
- ♥ python文件路径的组成11/23
内容反馈