Python 程序设计讲义(60):Python 的函数——递归函数
Python 程序设计讲义(60):Python 的函数——递归函数
目录
- Python 程序设计讲义(60):Python 的函数——递归函数
- 一、递归的概念
- 二、递归的实现
- 1、求n!
- 2、汉诺塔问题
函数一般是被其他程序调用的,但函数也可以被自己内部代码调用。这种在函数内部代码中调用自身的方式称为递归。
一、递归的概念
递归可以将复杂的问题简单化。递归把一个复杂的问题,按照特定的规律,逐步简化为多个更小的同类问题,并延续这个简化过程,直到问题得以解决。然后返回,依次解决问题,最终解决复杂问题。
递归包含以下两点:
1、递归终点:递归的结束条件,当结束时必须有对应的值。
2、递归方式:每次递归要执行的操作,并且该操作是向递归终点发展的。
例如:求5!
可以使用递归实现
递归终点:1!=1
5!=5*4!
4!=4*3!
3!=3*2!
2!=2*1!
二、递归的实现
函数中的递归是通过反复调用函数自身来实现的。
1、求n!
代码如下:
def fac(n):if n==1:return 1else:return n*fac(n-1)print(fac(5))程序的执行结果为:
120
2、汉诺塔问题
有n
个标记为1,2,3,...,n
的大小互不相同的盘子,3
个标记为A,B,C
的塔。借助塔C
把所有盘子从塔A
移动到塔B
。
初始状态时所有盘子都放在塔A
,任何时候盘子都不能放在比它小的盘子的上方,每次只能移动一个盘子,并且这个盘子必须在塔顶位置。
当只有一个盘子时,即n=1
时,我们可以简单地把这个盘子直接从塔A
移动到塔B
。这就是该问题的终止条件。
当n>1
时,我们依次解决以下三个问题即可:
(1)借助塔B
将前n-1
个盘子从塔A
移动到塔C
。
(2)将盘子n
从塔A
移动到塔B
。
(3)借助塔A
将前n-1
个盘子从塔C
移动到塔B
。
代码如下:
def han(n,a,b,c):if n==1:# 当只有一个盘子时,即n=1时,我们可以简单地把这个盘子直接从塔A移动到塔B。print('{}:{}-->{}'.format(n,a,b))else:han(n-1,a,c,b) #借助塔B将前n-1个盘子从塔A移动到塔C。print('{}:{}-->{}'.format(n,a,b)) #把最后一个盘子直接从塔A移动到塔B。han(n-1,c,b,a) #借助塔A将前n-1个盘子从塔C移动到塔Bhan(4,'A','B','C')程序结果为:
1:A-->C
2:A-->B
1:C-->B
3:A-->C
1:B-->A
2:B-->C
1:A-->C
4:A-->B
1:C-->B
2:C-->A
1:B-->A
3:C-->B
1:A-->C
2:A-->B
1:C-->B