Discuss / Python / 汉诺塔,果真是不好理解啊!不看参照果断总结不出来这个规律。。。

汉诺塔,果真是不好理解啊!不看参照果断总结不出来这个规律。。。

Topic source

先上我自己的代码。。。和大家的没什么区别了!

# -*- coding: utf-8 -*-
# 汉诺塔
B=[]
def move_hanoi(n,a='A',b='B',c='C'):
    if n==1:
        print(a,'-->',c)
        B.append(a+'-->'+c)
    else:
        move_hanoi(n-1,a,c,b) #将前n-1个盘子从A移动到B上
        move_hanoi(1,a,b,c) #将最底下的最后一个盘子从A移动到C上
        move_hanoi(n-1,b,a,c) #将B上的n-1个盘子移动到C上
n=int(input('请输入汉诺塔的层数:'))
move_hanoi(n,'A','B','C')
print('总共需要操作'+str(len(B))+'次,\n'+'操作过程为:',B)

不过呢,我自己推导了一遍n=3情况下的print步骤,希望有助于大家理解: (一定要注意调用中,大循环和循环中n的变化,才能判断好下一组参数是从哪里变化来的。。。)

# move(3,'A','B','C')
n = 3:
    ①move(n-1,a,c,b) ⇒ move(2, 'A', 'C', 'B') #第①次
     n=2:
        ①①
        move(n-1,a,c,b) ⇒ move(1,'A', 'B', 'C') #第①次-1
            n=1:
           ①①①
         print('A', '->', 'C') #第①次-1-1
        ①②
        move(1,a,b,c) ⇒ move(1,'A', 'C', 'B') #第①次-2
            n=1:
            ①②①
            print('A', '->', 'B') #第①次-2-1
        ①③
        move(n-1,b,a,c) ⇒ move(1,'C','A','B') #第①次-3
            n=1:
            ①③①
            print('C', '->', 'B') #第①次-3-1

    ②move(1,a,b,c) ⇒ move(1,'A', 'B', 'C') #第②次
   n=1:
        ②①
        print('A','->', 'C') #第②次-1
    ③move(n-1,b,a,c) ⇒ move(2,'B','A','C') #第③次
     n=2:
        ③①
        move(n-1,a,c,b) ⇒ move(1,'B', 'C', 'A') #第③次-1
            n=1:
           ③①①
         print('B', '->', 'A') #第③次-1-1
        ③②
        move(1,a,b,c) ⇒ move(1,'B', 'A', 'C') #第③次-2
            n=1:
            ③②①
            print('B', '->', 'C') #第③次-2-1
        ③③
        move(n-1,b,a,c) ⇒ move(1,'A','B','C') #第③次-3
            n=1:
            ③③①
            print('A', '->', 'C') #第③次-3-1

InterstellarM

#2 Created at ... [Delete] [Delete and Lock User]

确实是不好理解,大循环里的小循环。。。。。

Athena_小笛

#3 Created at ... [Delete] [Delete and Lock User]

请问,为什么我把n=1,n=2的情况列上去,函数会栈溢出呢?

def move(n,a='A',b='B',c='C'): if n==1: print(a,'-->',c) if n==2: print(a,'-->',b) print(a,'-->',c) print(b,'-->',c) else: move(n-1,a,c,b) move(1,a,b,c) move(n-1,b,a,c)

RecursionError: maximum recursion depth exceeded in comparison

if n is 1:
    print(a,'-->',c)
elif n is 2:
    print('%s --> %s\n%s --> %s\n%s --> %s' %(a,b,a,c,b,c))
else:
    move(n-1,a,c,b)
    move(1,a,b,c)
    move(n-1,b,a,c)

output: A --> C A --> B C --> B A --> C B --> A B --> C A --> C

完全没有你说的问题,目测应该是你没有用elif,逻辑不对

另外,能不写的就不写,无论从代码的简洁还是逻辑上都没有必要加上 n == 2 的判断

什么_99862

#5 Created at ... [Delete] [Delete and Lock User]
在此插入代码
n = int(input("输入初始化时A塔上盘子的个数n:\n"))  
def move( n , A , B ,C ):     
    if n == 1 :         
        print( "%s is moved to %s" %(A ,C) )  
    else :  
        move( n-1 , A , C , B )     
        move( 1 , A , B , C )  
        move( n-1 , B , A , C )  
move( n ,'A' , 'B' , 'C')

n=3 那么执行 1 move(2,a,c,b) 2 move(1,a,b,c) 3 move(2,a,c,b) 下面执行1 返回函数执行以下三个操作: move (1,a,b,c)%本来是a,c,b但是第一个是把参数23互换,那么又变为a,b,c了 move (1,a,b,c) %同理 move (1,c,a,b) 执行这一步完毕显示 a-c a-b c-b 下面执行2 move (1,a,b,c) 显示a-c 下面执行3 同理有下面三个操作 move (1,b,c,a) move (1,b,a,c) move (1,a,b,c) 执行这一步完毕显示 b-a b-c a-c 结束显示

A is moved to C
A is moved to B
C is moved to B
A is moved to C
B is moved to A
B is moved to C
A is moved to C

什么_99862

#6 Created at ... [Delete] [Delete and Lock User]

刚发现执行1操作2写错了,应该是 move (1,a,c,b)


  • 1

Reply