本节内容
一、概述
在函数内部,可以调用其他函数。但是一个函数在内部调用自身,这个函数被称为递归函数。
二、简单介绍
那递归具体是怎么实现的呐?下面我们就来看看如下代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def calc(n): print(n) if int(n/2) == 0: #结束符 return n return calc(int(n/2)) #调用函数自身m = calc(10)print('----->',m)#输出结果10521-----> 1 #最后返回的值 |
看到这边,有限小伙伴有些蒙圈,好吧,下面我用一个图,来解释一下吧!请看图:

根据代码,最后一层,一定需要一个结束符,来结束。
我们再来举一个经常用到的例子,1+2+3+4+.....+100的例子:
|
1
2
3
4
5
6
7
8
9
10
|
def add_to_100(n): if n == 0: return n return n + add_to_100(n-1)n = add_to_100(100)print(n)#输出5050 |
这个例子告诉我们,add_to_100(n-1)返回的是n-1+add_to_100(n-2)......这个就是递归的奥秘之处。
三、递归特性总结
- 必须要有一个明确的结束条件。
- 每次进入更深一层的递归时,问题规模相比上次递归都应该少(问题规模:比如你第1次传进的是10,第2次递归应该是9...依次越来越少,不能越来越多)。
- 递归的效率不高,递归层次过多会导致内存溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈贞,每当函数返回,栈就会减一层栈贞。由于栈的大小不是无限的,所以递归的次数过多,会导致栈溢出)。
第3点关于这个内存溢出说明:栈不是无限的,它是有限的,过多会导致内存溢出。如图:
