汉诺塔,果真是不好理解啊!不看参照果断总结不出来这个规律。。。
Topic source请问,为什么我把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 的判断
在此插入代码
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
- 1
用户6223899516_84125
先上我自己的代码。。。和大家的没什么区别了!
不过呢,我自己推导了一遍n=3情况下的print步骤,希望有助于大家理解: (一定要注意调用中,大循环和循环中n的变化,才能判断好下一组参数是从哪里变化来的。。。)