3.3递归
1.高斯求和与数学归纳法
高斯算1-100的和用到了递归(Recursion),递归源自数学归纳法(Mathematical Induction),其是一种 数学证明方法,常用于证明命题1在自然数范围内成立。
使用递归设计程序的时候,从最终结果入手,即要想求得 gaussian_sum(100),计算机会把这个计算拆解为求得gaussian_sum(99)的运算,以及gaussian_sum(99)in± 100的运算。以此类推,直到拆解为 gaussian sum(1)的运算,就触发终止条件,也就是if结构中n=1时,返回一个具体的数1。尽管整个递归过程很复杂,但在编写程序时,只需关注初始条件、终止条件及衔接,而无须关注具体的每一步。计算机会负责具体的执行。
2.函数栈
程序中的递归需要用到栈(Stack)这一数据结构。所谓数据结构,是计算机存储数据的组织方式。栈是数据结构的一种,可以有序地存储数据。
栈最显著的特征是“后进先出”(LIFO, Last In, First Out)。栈的每个元素,称为一个帧(frame)。栈只支持两个操作: pop和push。栈用弹出(pop)操作来取出栈顶元素,用推入(push)操作将一个新的元素存入栈顶。
所以,程序运行的过程,可以看作是一个先增长栈后消灭栈的过程。 每次函数调用,都伴随着一个帧入栈。如果函数内部还有函数调用,那 么又会多一个帧入栈。当函数返回时,相应的帧会出栈。等到程序的最后,栈清空,程序就完成了。
3.变量的作用域
Python寻找变量的范围不止是当前帧。它还会寻找函数外部。
函数会优先使用自己函数帧中的那个变量。
在函数调用时,会把数据赋值给这些变量。等到函数返回时,这些参数相关的变量会被清空。
当参数是一个数据容器时,函数内外部只存在一个数据容器,所以函数内部对该数据容器的操作,会影响到函数外部。
def inner_var(): print(m) m = 5 inner_var()