一天一个算法之递归–汉诺塔问题
1、令人掉头发的递归问题:递归是一种很巧妙的解决问题的方法,但是有点绕,因此它的运行速度并不比循环快,虽然程序看起来更容易理解。大部分人并不擅长使用这个工具,让我们从汉诺塔开始研究吧。
问题是这样的:寺院里有3根柱子,第一根有64个盘子,从上往下盘子越来越大。方丈要求小和尚A1把这64个盘子全部 移动到第3根柱子上。 在移动的时候, 始终只能小盘子压着大盘子, 而且每次只能移动一个盘子。
i=1
def move(n,mfrom,mto):
global i
print("第%d步:将%d号盘子从%s->%s"%(i,n,mfrom,mto))
i += 1
def hanoi(n,A,B,C):
if n==1:
move(1,A,C)
else:
hanoi(n-1,A,C,B)
move(n,A,C)
hanoi(n-1,B,A,C)
#******************程序入口**************************
try:
n=int(input("please input a interger:"))
print("移动步骤如下:")
hanoi(n,'A','B','C')
except ValueError:
print("please input a integer n(n>0)!")
这个代码我觉得比较难理解的地方在else那边,就是递归那部分,为什么是
hanoi(n-1,A,C,B)
move(n,A,C)
hanoi(n-1,B,A,C)
可能就是找出最基本的那个循环模块,然后就不断调用。画图出来更好理解。
2、递归还可以用在快速排序上:
def quicksort(array):
if len(array) < 2:
return array #基线条件:为空或只包含一个元素的数组是“有序”的
else:
pivot = array[0] #递归条件
less = [i for i in array[1:] if i <=pivot] #由所有小于基准值的元素组成的子数组
greater = [i for i in array[1:] if i > pivot] #由所有大于基准值的元素组成的子数组
return quicksort(less) + [pivot] + quicksort(greater)
print(quicksort([10,5,2,3]))