汉诺塔问题的python实现

汉诺塔游戏三条规则:

1、一次搬动一只盘子

2、每根柱子上只有最上方的盘子可以动

3、大盘子不可置于小盘子上

迭代实现:

def hanoi(n,disk):
    '''
    n: 盘子数
    disk: 长度为n的数组,每个位置为该盘子目前所在柱子编号(0,1,2),初始全为0
    盘子从上到下编号依次增大,1 -> n
    '''
    if n % 2 == 0:
        for i in range(1,2**n):
            #step 1
            k = 0
            while i % 2 == 0:
                k += 1
                i /= 2
            #step 2
            if (k+1)%2 == 0:
                disk[k] = (disk[k] - 1)%3
            else:
                disk[k] = (disk[k] + 1)%3
    else:
        for i in range(1,2**n):
            #step 1
            k = 0
            while i % 2 == 0:
                k += 1
                i /= 2
            #step 2
            if (k+1)%2 == 0:
                disk[k] = (disk[k] + 1)%3
            else:
                disk[k] = (disk[k] - 1)%3
    return disk

#example
n = 7
disk = [0]*n
print(hanoi(n,disk))



递归实现:

def hanoi(n,A,C,B):
    '''
    n: 为汉诺塔盘子数量
    A,B,C:分别问三个柱子编号,在这里用三个数组存放盘子编号
    '''
    if not n:
        return 
    hanoi(n-1,A,B,C)
    #A -> C
    C.append(A.pop())
    hanoi(n-1,B,C,A)

    return C

#example
n = 7
A = [i for i in range(n,0,-1)]
C = []
B = []

print(hanoi(n,A,C,B))

参考书籍:

俞征武 《图解算法》第一章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值