递归是算法的经典方法,他主要有两个特点:1.调用自身。2.结束条件。这两个条件缺一不可。
给大家举几个例子:
第一个不满足递归:既没有调用自身,也没有结束条件。
第二个满足递归:调用自身func3(x-1),结束条件(x-1)直到x<0
第三个满足递归:调用自身func2(x+1),但是没有结束条件(x+1始终大于0不会结束)
第四个满足递归:大家自己想想为什么
大家简单了解递归后,咱们来看一个递归的经典问题——汉诺塔问题
主要的问题就是将所有盘子,从A移动到C,在小圆盘上不能放大圆盘,每次只能移动一个盘子。
咱们设盘子的个数为n,首先当n=2时,
先将最顶上的盘子移动到B,再将最底下的大盘子移动到C
最后将B中盘子移动到C
这就是汉诺塔问题最基本的步骤,现在有n个盘子,咱们继续按这个思路分析
将最上面的n-1个盘子视为一个整体,先将n-1个盘子从A经过C移动到B(经过C的意思是,n-1个盘子每次移动一个,直到移动到B肯定会经过C)代码表示:hanoi(n-1,A,C,B)
再将第n个盘子从A移动到C,代码表示print(“moving from %s to %s”%(A,C))(因为一个盘子,一步,不需要调用本身)
最后将n-1个盘子从B经过A移动到C代码表示:hanoi(n-1,B,A,C)
汉诺塔问题就解决了
def hanoi(n,A,B,C):
if n >0:
hanoi(n-1,A,C,B)
print("moving from %s to %s"%(A,C))
hanoi(n-1,B,A,C)
hanoi(3,'a','b','c')#n=3时