其實一直到現在我都不知道自己有沒有學會遞迴,因為做題的時候我也是避重就輕挑著我擅長的題做,所以這方面一直沒有得到突破性的提高。
因為遞迴的概念很好理解,但是實際操作起來就會讓人很迷糊,比如說漢諾塔。
但昨天老師在群裡面分享了四節遞迴課程,我決定重新拾起我以前沒有幹完的活。
那麼我們就先從漢諾塔這個經典的遞迴開始學吧,以前我在看這道題的時候,總是會想著去模擬這整個過程。
或者我會在紙上面畫圖模擬整個過程,而且時常畫著畫著就畫糊塗了。
可能你很疑惑,為什麼要模擬過程呢?
因為我不理解他為什麼只在呼叫他自己時把引數的位置改一改就可以得到全部過程。
但現在看來,著實沒有必要,我們只需要知道我們得把這n-1個盤子移動到b盤,再把最底下的盤子移動到c盤,再把n-1個盤子移動到c盤就好了。
也就是說,我們把它分為兩個整體,n-1個盤子為乙個整體,最底下的盤子是乙個整體,但是那n-1個盤子是怎麼移動的呢?
我能告訴你的只有他會重複之前的步驟,把n-1分解成為n-2個盤子和第n-1個盤子,n-2個盤子怎麼移動的呢,分解成n-3個盤子和第n-2個盤子唄,後面的也以此類推。
直到我們分解到最頂上那個最小的盤子的時候,只需要把它從a盤拿到c盤就可以了(這是乙個出口,也就是說我們的棧已經滿了,需要乙個判斷出口,把那些堆進棧的東西都乙個個拿出去)
那麼現在我們知道該怎麼把這乙個大問題分解成幾個小問題,也知道出口是什麼,**就很好寫了。
#include#includeusing
namespace
std;
int a,ans=0;//
ans是用來記錄總共移動的次數的
void hnt(int n,char a,char b,char c)
else
}int
main()
為什麼明明我們需要用這三個柱子來進行操作,可是輸出的時候只用輸出a和c呢?
不知道你有沒有注意到我們在進行遞迴的時候,呼叫函式的引數我們讓他改變了。
所以a、b、c每個變數裡面的字元都不一樣了,所以只要輸出a和c就可以達到我們想要的結果。
你可能會想,我們把他改變了,他會是怎麼執行的呢?要不我計算試試看?
那麼我只能告訴你,千萬不要計算,不要去深究這個問題。因為你會發現你越算越糊塗,越算越不會。
只需要知道這個為什麼要這樣算,不需要知道她是怎麼算的。
也就是說我們只要計算方法和結果,過程不重要。
漢諾塔 遞迴
個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。include include include include include include include include include include include include include 標頭檔案引用的較多...
遞迴漢諾塔
遞迴問題 遞迴要有三個要素 1.遞迴結束條件 2.遞迴結束時的處理 3.抽取重複的邏輯,剝離外殼 重點都在這一步 漢諾塔問題 把圓盤從下面開始按大小順序重新擺放在另一根柱子上。且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。首先,要搞這個編碼得要知道漢諾塔的解題思路 1.把a塔上...
遞迴 漢諾塔
漢諾塔問題。這裡順便可以求出一共需要搬運的次數。以下是漢諾塔問題的解法 class hanoi from 搬運的起點,to 搬運的目標地,middle 臨時中轉地 private static int hanoi int level,char from,char to,char middle int...