递归调用

函数可以调用其它 函数也可以调用自身。 递归就是引用(或者调)自身的意思。 但持续递归就会引起程序错误。

# 如下递归,持续运行至崩溃 
def fibs ():
    return fibs()
fibs()

程序以“超过最大递归深度”结束。

在讲菲波那切数列的时候,定义了fibs函数,在函数里面,要调用自己。持续调用自己就会出现错误,如上,错误提示已经超过最大递归深度,于此同时,看提示堆栈,可以看到都是不断调用fibs的语句。这段语句没有结束,函数栈空间全部消化光了。当然,无终止条件的递归在程序实现中一般不会出现的。如果真的出现了这个错误,那么必然是程序写的有问题了。

例如,设计一个N的阶乘,怎么设计呢?什么叫做阶乘呢,阶乘就是给定一个数字N,然后计算从N开始,计算N * (N – 1),直到N = 1结束。写成阶乘:

def calculate (n):
    result = n
    for i in range (1,n):
        result *= i

代码实例:

这个函数里边,只有一个参数。计算从零开始,直到输入参数内的阶乘。当参数为5,那就5×4×3×2×1,就是5的阶乘,计算结果:120。

对于阶乘的计算,如果一个数的阶乘是f(n),那么f(n + 1)的阶乘不就是(n + 1) * f(n)了吗?这很明显是一个递归的过程。

于是,优化N的阶乘。定义一个函数calculate。当n=1,因为1的阶乘还是1,因此返回1。否则,返回n乘以n – 1的阶乘。

看是不是这样的效果一样可以达到,输入5的阶乘,结果为120,3的阶乘就是6。较小部分递归调用,至少调用一次和多个,但多个也是有限次的调用,不能像前面是无限的,一定会超过最大递归深度的。当然,如果一个问题递归深度太深,怎么办呢,这个时候大家可以把递归修改为循环的方式。循环不一定能被递归代替,但递归一定可以被循环代替的!

IT赶路人

专注IT知识分享