無法理解漢諾塔問題的遞迴,是不是與程式設計無緣了

時間 2021-05-29 22:19:05

1樓:SteveForever

記得才開始看漢諾塔問題時,我是假設N=3,N=4,然後開始了畫圖找規律...

後面用數學寫遞迴關係,發現很容易記住

理解:有N個盤子從A柱移動到C柱,以B柱為橋梁,設需要F(N)次1、首先把N-1個盤子,從A柱移動到B柱,需要F(N-1)次2、把A柱上的僅有的1個盤子,從A柱移動到C柱,需要一次3、把B柱上的N-1個盤子,從B柱移動到C柱,需要F(N-1)次所以:F(N)=2*F(N-1)+1,n>=2F(1) = 1

然後開始程式設計就可以了

我最開始是通過這個方式理解記憶的,一步一步來,你可以的!

2樓:繳械Everyday

說起漢諾塔我就想起今年NOIp 離譜的 T3 移球遊戲。說起NOIp,我就想起明年4月份jyb、CCF合拍的省選即將開幕,我將繼續扮演被各路神仙吊打的小蒟蒻&&人輸形象,希望大家多多來踩,whk和OI兩開花

3樓:

理解不了,就把自己當電腦,一行一行模擬推一遍,再不行換個n推第二遍,再不行推第三遍。你自己重複了哪個部分,找找規律。

繼續用知乎問這種問題,大概和包括程式設計在內的多數需要搜尋引擎的工作都無緣了

4樓:少君同學

理解遞迴重要的是理解「子問題」,所謂子問題就是和原問題完全相同,只是規模小一些;注意分析問題時要找子問題以及子問題和原問題的關係,不是找「子問題的解」。

回到漢諾塔,假設 f(n) 表示「把 n 個盤子從 a 柱移到 c 柱所需步數(注意a到c、a到b、c 到 b 等是相同問題)」,則子問題 f(n-1) 表示「把 n-1 個盤子從 a 柱一到 c 柱所需步數」,那麼從 f(n-1) 到 f(n),可以看到,n-1 個盤子從 a 到 c 需要 f(n-1),第 n 個盤子從 a 到 b 需要1步,把 n-1 個盤子從 c 到 b 正好又是 f(n-1),合起來就是 f(n)=2f(n-1)+1。

有了遞推式,然後找下遞迴出口就行了,容易看到 f(1)=1,結合遞推式,就能求解 f(n)。

這個式子可以用迭代(即迴圈)去做,用遞迴則是:

function f(n)

5樓:

氣笑了+1

你知道我學揹包學了多久嗎? 理解KMP用了多久嗎? 理解IDA*用了多久嗎?

一上午hhhhhhc 才一上午夠幹啥的啊

6樓:零不過百

我覺得這張遞迴遞迴樹非常清晰明了,如果能結合著二叉樹的中序遍歷理解就更好了。資料結構少不了遞迴的思想,比如全排列,迷宮,dfs都是經典的遞迴問題,或者你也可以先看看二進位制轉換,反序輸出這種簡單的遞迴。

7樓:

漢諾塔問題其實本質上是個動態規劃,是有最優子結構的,而且遞迴發生在每一層的頭部而不是尾部,不是很容易理解,也不是很容易教好。如果剛開始的話跳過去其實問題不大的,先學會簡單的深度優先搜尋,然後理解了動態規劃的原理再來看這個問題也可以。

如果你實在想理解的話,可以買個九連環來玩玩,不要用腦子,用手去理解(逃

8樓:機器學習入坑者

我覺得漢諾塔這個問題,就不應該放在程式語言課程中,或者應該提示這個問題超出了需要掌握的大綱。儘管我看了很多教材,都有漢諾塔這一節。

遞迴這個概念應該放在《演算法導論》,或者是《資料結構與演算法》之類的課程中。

在學習漢諾塔之前,應該先看看深度優先事搜尋和廣度優先搜尋,對「遞迴」有個初步的認識。然而,在學python的時候就直接解漢諾塔問題,並想要對此達到「理解」,我覺得難度是非常大的,做不到完全沒有關係。

我想到了另乙個程式語言教程中常見的例子,叫做二分查詢,有的書中還會給出它的時間複雜度。我覺得想要理解二分查詢的難度也是很大的。

學習程式語言是乙個漸進的過程,語言只是比較複雜工具,漢諾塔問題和程式設計的關係並不大,這更多是乙個數學上的問題。如果想要把教材中的各種演算法搞清楚,建議還是專門看看講演算法的書。

9樓:

我中學的時候看漢諾塔也沒搞明白,後來放到一邊,上大學之後很自然就明白了。

我分析之前沒明白乙個關鍵原因是我那時候必須窮舉一遍計算過程才感覺自己懂了,但你窮舉一遍肯定腦子就爆棧了。你要放棄這種遍歷的想法。遞迴解漢諾塔就是把大問題拆成小問題,只要小問題能解決大問題就一定能解決,別管小問題怎麼解決的,相信它就完事了。

多練習練習類似的題,好好睡覺,用不了多久你自然就明白了。

10樓:Cone

人理解遞推,神理解遞迴,現在不能理解,只能說明理解的角度不對,不是無緣程式設計,程式設計大多都靠努力,人差別最小的就是智商,加油!

11樓:

那要看有沒有學過其他語言或者演算法之類的了。

如果你剛入門,一開始理解不了很正常,因為程式思維的養成需要一段時間。

但是如果你學程式設計已經一兩年了,還看不懂漢諾塔,那我勸你放棄吧。

12樓:藍彼得

這是我看過介紹遞迴最好的文章了。

雖然這是我寫的。

當然,如果想理解的更深刻,你還需要知道函式和函式呼叫:

13樓:zanxas

可能他講解的方式不適合你,多看看其他的書關於遞迴的講解。

而且用漢諾塔講遞迴確實有點為難人,一般都是拿斐波那契和階乘作為入門教材的。

我推薦你去看sicp第一章。

14樓:蔣甬杭

遞迴這東西,因為涉及棧資訊,其實用c的除錯模式(visual studio .net或gdb)更容易理解。因為可以直接檢視各個棧的內容。

15樓:Fanix

初學程式設計不理解遞迴很正常,因為那不是以前接觸到的思維方式。它是逆向的從後往前推到的方式得到的結果。

就好比從孫子往上找爺爺,那一定先找爸爸,一層一層遞進的關係。樹形結構尤其好理解,因為就是層級關係。

理解了這個,接下來就是用函式呼叫函式自身完成這個遞進關係就可以了。通常遞迴要先寫乙個基礎,就是第一層關係,然後再呼叫函式自身往下延展。

16樓:Intopass

其一,先熟悉基本語法,先弄明白函式是怎麼回事,先寫乙個簡單的兩三層的自身呼叫。

其二,找個漢諾塔遊戲,自己通關。

只要還會上網發帖,就不至於程式設計入不了門。

任何學習都有方法,要從易到難。

17樓:六公尺前的水

這就放棄了?連第一步邁出的門檻還沒踏到呢。

遞迴雖然在實際中很少用到(我一般只在樹形結構,檔案系統讀取這些地方用到遞迴),但非常適合作為乙個思維訓練的題目。

因為現實世界中很少遇到這種自呼叫的情形,我能想到的唯一乙個例子,是你兩邊各放一面鏡子,然後你扭頭看看,會發現乙個鏡子裡面套著乙個鏡子和你,無限延伸。

這種就是遞迴的感覺,乙個場景裡面套著乙個相同場景。

另外,後面理解類的概念可能更困難。

18樓:z展新

可以放棄了,換個容易點的行業。那個行業如果再有半天時間無法理解的知識技能,也可以放棄,再找更容易的行業,最後怕是躺平最舒服。

普通正常人,沒有任何相關先驗知識,要完全理解遞迴一般都要幾天時間甚至幾周的時間進行內化。當正常人心思專注卻覺得學習吃力時,90%是教材和你水平匹配的問題,此時應該尋找不同的教材,嘗試多角度理解乙個知識點,然後就是給予自己時間。

19樓:日天山君

遞迴問題,其實想明白了就很簡單,概括了說就是大問題與小問題同解。

比如漢諾塔,要將n層的漢諾塔從A移動到B,只需要將上面的(n-1)層移動到C,再將第n層移動到B,最後將上(n-1)層移動到C就可以了,將這個過程概括為f(n, A, B)。

同理,移動上面的(n-1)層也就是f(n-1, A, C)了。

最後當n=1的時候,只有一層直接移動就可以了。

20樓:海洋餅乾叔叔

做為老師, 愛學習的程式設計者掉隊,不能忍。我覺得你還可以拯救一下。下述內容節選自:

另外,廖老師程式設計師出身,... 或許不太能理解初學者為什麼學不會。。。。 他的教程可能不太適合初學者,你也可以試試下面這個網課(真不要錢):

Python程式設計基礎及應用重慶大學高等教育出版社,作者親授_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili

是不是父母永遠無法理解孩子?

負紅顏 不是永遠,但也差不多。就算是同齡人,其實也很難互相理解。乙個低慾望的人,很難理解那些時尚達人對fashion的追求。乙個家庭貧困,在社會上摸爬滾打好幾年的同齡人,很難理解乙個中產對體面的重視和需求。而父母和我們,如同兩列行使在不同軌道上的火車 綠皮車和高鐵。我們行走於不同的時代,都被時代所侷...

初學者如何深入理解漢諾塔問題?

gongxy21 今天我也看到遞迴了。我的思路如下,遞迴源於歸納,當n等於1時,推出結果。當n等於t 1時推出結果,並能由此推出,當n等於t時也推出結果,即M t 能表達出M t 1 的關係。第一步確定漢諾塔的結果是什麼。漢諾塔的結果就是當有幾個圓盤在原柱子時,結果就是就把這些柱子移到目標柱子。展開...

如何反駁喜歡說「你不是我,你無法理解我的狀況和感受」的人?

貝塔 工作在聽力醫療行業,面對的使用者也就是聽力有問題的使用者以及這些使用者的家長,從聽力有問題這個角度來說,他們有一定的特殊性質,但是又不特殊。當跟這些使用者在群裡進行聊天時,經常有使用者說,你不是聽損孩子的家長,你不會理解我的,每次聽到這句話瞬間不想講道理了。先分享我的觀點 帶著 好為人師 的屬...