C語言自學(xué)---函數(shù)遞歸
遞歸的通俗解釋:
將一個復(fù)雜的大問題變成多個類似的小問題,通過解決小問題層層遞進(jìn)從而將大問題解決,可以和循環(huán)放在一起進(jìn)行比較,兩者有一定的相似之處。
漢諾塔問題:
作為經(jīng)典的遞歸問題的代表,up主一開始也以為遞歸就是上面的通俗解釋就沒啥了,還以為挺簡單的,跟著網(wǎng)上的視頻教學(xué)學(xué)習(xí)以后解決了一些比較簡單的問題以后發(fā)現(xiàn)好像也不難,但是遇到漢諾塔問題以后就直接懵了,這玩意怎么用遞歸啊,于是我就在網(wǎng)上看人家的教學(xué),csdn上面呢寫的都挺好的,但是關(guān)鍵的明白是這個道理但是為什么這樣做呢,于是就看視頻,接下來說說我自己的見解。
漢諾塔問題:
漢諾塔(Hanoi Tower)問題來源于印度一個古老傳說。大梵天創(chuàng)造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。也就是如下:

實(shí)際問題轉(zhuǎn)換過來就是將最左邊的64個圓盤位置變成最右邊的圓盤位置。
遞歸小問題轉(zhuǎn)化:
當(dāng)盤子只有一個的時候

只需要將A上的一個盤子直接移向C上即可。
當(dāng)盤子有兩個的時候

當(dāng)盤子增加到兩個時,首先做的就是將最上面一個圓盤放在輔助的柱子上,然后將下面的圓盤放在C柱上,再將輔助列的小圓盤放在C柱上,這樣就完成了。
如果當(dāng)盤子增加到三個時

具體的步驟移動步驟如上圖,移動兩個圓盤和三個圓盤時,可以類比成一樣的情況,當(dāng)圓盤從兩個變成三個時,把最下面的大圓盤變成一個整體(整體B),將大圓盤上面的其他圓盤變成一個整體(整體A),從而就將三個圓盤的問題變成了兩個整體(整體A和整體B)的問題可以近似堪稱兩個圓盤,也就是將三個圓盤從A柱移到C柱的問題變成了將整體A和B從A柱移到C柱的問題。
往后延伸的話,假設(shè)是有n個圓盤,那么整個大問題無非就是拆分成三步,第一步,將A柱的n-1個圓盤借助C柱移動B柱,第二步,將A柱的大圓盤移動到C柱,第三步,將B柱上的n-1個圓盤借助A柱移到C柱。以上也就是體現(xiàn)出遞歸思想的邏輯。
具體代碼如下:


在P2中可以看到輸出的結(jié)果是正確的,就以上的3個圓盤的例子,我們可以發(fā)現(xiàn)在hanoi函數(shù)中其實(shí)也就是主要三個步驟,對應(yīng)的就是上面提到的三個步驟。
使用平臺:Visual Studio 2022
使用語言:C語言
以上內(nèi)容均屬個人思維邏輯,如有錯誤,大家可以提出疑問和質(zhì)疑。