在函数体内调用自身称为函数递归。函数递归涉及一个隐式循环,该循环在没有循环控制的情况下重复一段代码。
例如,有以下数学问题。已知有一个序列: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过滤函数的用法和用法11/30
- ♥ 拆分和合并python字符串09/18
- ♥ Python示例:用代码画一个五角星09/28
- ♥ python3.6如何安装库11/18
- ♥ python中的%是什么意思08/14
- ♥ 如何安装python的ipy10/28
内容反馈