day3-递归
定义
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
演示
def cal(n): #定义函数 print(n) return cal(n) #调用自己 cal(10) #输出 10 10 。。。 File "C:/Users/Administrator/PycharmProjects/review20201128/day01.py", line 2, in cal print(n) RecursionError: maximum recursion depth exceeded while calling a Python object
解析:可以看到程序调用后,出现报错,这是因为Python为了程序保护,只允许递归调用999次。
验证代码如下:
def cal(n): print(n) return cal(n+1) cal(0) #输出 0 。。。 997 File "C:/Users/Administrator/PycharmProjects/review20201128/day01.py", line 3, in cal print(n) RecursionError: maximum recursion depth exceeded while calling a Python object Process finished with exit code 1
小结:这样的递归会让程序进入一个无限的死循环中,外面的程序还没有执行完,又开始执行里面的程序,一层套一层的往下执行。
根据以上图例,递归一定需要一个结束符来结束循环,否则将会引起系统崩溃。
下面我们来看另外一个例子
def cal(n): #定义函数 print(n) if int(n/2) > 0: #加条件,如果n/2>0,执行下面语句 return cal(int(n/2)) print("->",n) cal(10) #输出 10 5 2 1 -> 1
解析:可以看到循环传入10参数后,当n>0时,循环结束。
总结
递归特性
1.必须有一个明确的结束条件;
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)