一天一个算法之递归--汉诺塔问题

一天一个算法之递归–汉诺塔问题

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]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值