递归
递归应该放在汉诺塔问题之前讲的,因为汉诺塔问题就是用递归解决的,所以今天补上!
递归是个很基础的知识点,我记得大学C语言的前面就讲了递归,可见递归是个简单却又重要的知识点!
递归的具体文字解释,我就不说了,简单来说,递归就是不断调用自己,直到达到终止条件。
所以, 递归的两个特点: 调用自身、结束条件
我就简单句几个例子说明一下:
1. def func1(x):
print(x)
func1(x-1)
没有结束条件,我们都不知道到递归什么时候结束,所以不是合法的递归
2. def func2(x):
if x > 0:
print(x)
func2(x+1)
看似有结束条件x>0,即当x<=0时结束,但x+1会永远大于0,即依然不会结束,故相当于没有结束条件,不是合法的递归
所以,递归是否有结束条件,不能只看代码里是否有判断条件,还要结合代码,判断递归结束条件是否有效
3. def func3(x):
if x > 0:
print(x)
func3(x-1)
是合法递归
用递归计算阶乘
n的阶乘=nx(n-1)x(n-2) x…x2x1
比如5的阶乘即为5x4x3x2x1=120
下面看看代码:
def func(n):
s = 0
if n == 1:
return 1
else:
s = n * func(n - 1)
return s
先定义s,来存储阶乘的乘积,再加结束条件。因为阶乘最多就是乘到1,所以我们判断当n减到1时,就返回1,不然就一直调用自己本身。
举个栗子——5:
5≠1,所以此时s=5*func(4);
再看func(4):
n=4≠1,所以func(4)=4*func(3),此时s=5*4*func(3);
再看func(3):
n=3≠1,所以func(3)=3*func(2),此时s=5*4*3*func(2);
再看func(2):
n=2≠1,所以func(2)=2*func(1),此时s=5*4*3*2*func(1);
再看func(1):
n=1,则此时函数返回1,即func(1)=1,所以此时s=5*4*3*2*1=120
再用程序验证一下:
def func(n):
s = 0
if n == 1:
return 1
else:
s = n * func(n - 1)
return s
print(func(5))
结果为120
,正确!