2.3.2Python-递归

总目录:https://www.jianshu.com/p/e406a9bc93a9

Python - 子目录:https://www.jianshu.com/p/50b432cb9460

递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

这个就是一个例子:

如果不理解递归的意义,以为会输出:

3

2

1

0

------

0


但是让我们仔细分析一下运行的过程:

仔细分析递归的意义,并且结合递归的运算方式,正确的输出结果为:

3

2

1

0

------

0

1

2

3

递归的第一个难点便是,进入循环时后面的语句在循环结束后也要执行。

比如这个例子三次递归,可以理解为三层嵌套,第三层嵌套结束后会执行第二次嵌套最后的语句,第一层同理。

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。


最简单的例子就是数值递归运算:

def fact(n):

    if n==1:

        return 1

    return n * fact(n -1)

如果print(fact(5))的话会输出120,但是print(fact(1000))呢,会报错。这不是程序哪里错误了,这就是递归太多导致栈溢出。

解决递归导致栈溢出的方法就是进行尾递归优化,但是大多数编程语言都没有进行尾递归优化,所以通过尾递归调用一样会导致栈溢出:

def fact(n):

    return fact_iter(n,1)


def fact_iter(num, product):

    if num ==1:

        return product

    return fact_iter(num -1, num * product)

你可能感兴趣的:(2.3.2Python-递归)