神奇的递归
费了好大的劲才对递归算法有了点浅显的理解,在这与大家分享一下典型例子的代码。
九九乘法表
经典循环算法:
for i in range(1,10):
for j in range(1,i+1):
result = i * j
print("%s * %s = %s" %(j,i,result),end='\t')
print()
递归算法实现:
def mul(i,j):
if i >= 1:
if j <= i:
result = i * j
print("%s * %s = %s\t" %(j,i,result),end='')
j += 1
# 设置递归退出界限条件,这很重要
if j > i:
j = 1
i -= 1
print()
mul(i,j)
if __name__ == "__main__":
# 这里的输出会是倒序排列的,大家可以试一下修改传递的参数和判断条件来实现正序排列
mul(9,1)
汉诺塔
还有一个理解递归算法的经典案例,汉诺塔,这里的代码参考FishC论坛的小甲鱼
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
其实算法非常简单。当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;若n为奇数,按顺时针方向依次摆放 A C B。
def hanoi(n,x,y,z):
if n == 1:
print(x+str(n)+' ---> '+z+str(n))
else:
hanoi(n-1,x,z,y) # 将前n-1个盘子从x移动到y上
print(x+str(n)+' ---> '+z+str(n)) # 将最底下的最后一个盘子从x移动到z上
hanoi(n-1,y,x,z) # 将y上的n-1个盘子移动到z上
n = int(input("Please input the number of Towers:"))
hanoi(n,"X","Y","Z")
以上是Python中的实现过程。