請大神講解一下這個題。
任務
漢諾塔 (http://baike.baidu.com/view/191666.htm) 的移動也可以看做是遞歸函數。
我們對柱子編號為a, b, c,將所有圓盤從a移到c可以描述為:
如果a只有一個圓盤,可以直接移動到c;
如果a有N個圓盤,可以看成a有1個圓盤(底盤) + (N-1)個圓盤,首先需要把 (N-1) 個圓盤移動到 b,然后,將 a的最后一個圓盤移動到c,再將b的(N-1)個圓盤移動到c。
請編寫一個函數,給定輸入 n, a, b, c,打印出移動的步驟:
move(n, a, b, c)
例如,輸入 move(2, 'A', 'B', 'C'),打印出:
A --> B
A --> C
B --> C
無法理解這個題目的意思。
2016-11-20
你可以理解成這樣:move(移動個數,起點,轉折點,終點)
2016-08-27
百度了一下原理,大概弄明白了。加入a上面有兩個圓盤,要把a上面的圓盤移到c上,順序會是a—b;a—c,b—c。如果把圓盤數抽象為n的話,我們可以把n看成1和n-1的組成。把n-1看作一個單位的話,這樣,就可以把這個過程抽象為2個圓盤。那么,移動的順序也會是a—b;a—c,b—c。move(n-1,a,c,b)表示的是,將n-1個圓盤移動到b上面去,a表示的是起始點,b表示的是終點,c是轉折點;move(1,a,b,c)表示把最后一個圓盤由a移入c中,同理,a是起始點,c是終點,b是轉折點;最后move(n-1,b,a,c),即把事先移動好的圓盤從b放入c中,此時b是起點,c是終點,a是轉折點。望采納~~
附:http://blog.csdn.net/qugename/article/details/41088367? (當初就是看這個博客的解釋看明白的)
2016-07-26
????????if n==1:
?????? ? ? ?print a,"-->",c ? ?else:
2016-07-25
也是沒看懂,應該是把一張a搬到b,然后a在搬一張放到c,然后再把b的一張搬到c。
2016-07-25
a,b,c是定義到參數,被稱作形參,不具有任何意義,只是一個符號,不分配內存空間,只是告訴編譯器,move函數這里需要4個參數,名字為n,a,b,c.
當你調用move函數的時候,move(4,‘A’,‘B’,‘C’),這里傳入到4個參數被稱作實參,是實際存在的。
當程序執行這一步之后,去轉到 def move(n,a,b,c),開始執行子程序。
然后用實參代替形參。簡單的說,就是給形參創建空間,并且賦值為實參。
即:創建名字為n的變量,n=4,創建名字為a的變量,a=‘A’,創建。。。。
上面說的是子程序的調用和執行,你說無法理解這個題目,我這么跟你說吧,這是一個經典的遞歸程序,不論你學習哪種編程語言還是純粹的算法,講到遞歸必然是要講漢諾塔問題的。
我覺的題目已經解釋的非常清楚了,就是在重復的做一系列的過程:
如果a有N個圓盤,可以看成a有1個圓盤(底盤) + (N-1)個圓盤,首先需要把 (N-1) 個圓盤移動到 b,然后,將 a的最后一個圓盤移動到c,再將b的(N-1)個圓盤移動到c。
我貼一段代碼你理解一下吧,如果理解不了就google,這是最經典的遞歸思想,當然也是比較簡單的。不要認為它有難度。
def move(n, a, b, c): ? ?
????????if n==1:
?????? ? ? ?print a,"-->",c ? ?else:
? ? ? ?move(n-1,a,c,b)
? ? ? ?move(1,a,b,c)
? ? ? ?move(n-1,b,a,c)
move(4, 'A', 'B', 'C')
這里格式有點小問題,是粘貼導致的。。。。
2016-07-25
n代表圓盤數,ABC代表柱子,?move(2, 'A', 'B', 'C')表示,有2個圓盤,A上面的圓盤是按從小到大的的順序放置的,同樣按照從小到大的順序把A柱子上的圓盤移動到C柱子上面