-
首先,你要了解遞迴,遞迴到底是做什麼的? 遞迴是將原始任務劃分為幾個較小的任務,較小的任務可以直接求解或與原始任務性質相似,從而繼續呼叫函式,直到所有函式都能解決基本問題。
h(int n,char one,char two,char three),像這個函式一樣,它的功能是完成Khannotta的工作,也就是從一到三借二,這個任務可以分成3個小任務,什麼?
首先確定基本情況,當n==1時,就把它移過來,即函式表示為printf("%c-->c",one,three);然後我們可以先將 n-1 板從 1 移動到 2,借助 3,由函式 h(int n-1,char one,char three,char two) 表示,然後將第 n 個板移動到 3,即 printf("%c-->c",one,three);最後,我們將 n-1 板從兩個移動到三個,借助 1,即 (int n-1, char two, char one, char three),這樣整個大任務就用 3 個小任務完成了。
-
不知道大家能不能明白:
每次遇到h(x,y,z,r)都會為這個函式開啟乙個空間,雖然你反覆使用乙個函式,但每個函式都不一樣。
功能完成後,空間將縮回。
所以第乙個 h 只是最後乙個被收回的。
N、A、B、C 在每個函式中都不同,你不必用 ai、ai、bi、c 來表示第 i 次遇到 h,第 i 次傳遞資料,所以很清楚。
-
建議您抽象並理解。 首先找人將頂部的 n-1 從 A 移動到 B,將第 n 個從 A 移動到 C,然後找人將 B 上的 n-1 從 B 移動到 C
-
別管 a、b、c,只要記住前幾個引數,否則你永遠無法弄清楚。
-
河內塔可以理解為移動塔樓的遊戲,將n層的塔樓從乙個柱子移動到另乙個柱子。
2.這是河內漢諾塔(n,a,c)的遞迴原型 - n層的塔從A柱移動到C柱; 你必須每次都恢復到這個原型才能遞迴完成!
這就像 1-100 的遞迴累積 f(n)=f(n-1)+n; 此時,f(n) 是乙個遞迴原型,它回歸到 f(n-1) >。
3.中間要用一根B柱,河內塔的原型寫成Hunnuota(N、A、B、C)——N層塔在B柱的幫助下從A柱移動到C柱,這一步應該是可以理解的;
4.遞迴需要乙個出口,即乙個控制條件,當n=1時,可以直接將塔從A移動到C,即出口。
如果 n=2,你需要移動兩次,你不能做一次,你不能出去”。
1、這一步是理解河內塔遞迴的關鍵,需要形成N-1層向C柱移動的形式,分為三個步驟:
a.如果N層不能一次移動,那麼可以理解為A上方的N-1層先移動到B柱上。
B A柱與塔的n層移至C柱,C柱隨後在B柱上形成n-1層移至C柱——
遞迴補全。
-
遞迴相互疊加,函式呼叫自己,直到出現約束。 該函式自行呼叫自己,可以理解為 sum = sum + m; 為此新增乙個迴圈以找到總和; 這和調整自己的意思一樣,河內塔更深,你可以用遞迴的方式找到所有數字的總和,謝謝你幾次,你自然會。
-
執行遞迴程式的過程對於初學者來說總是難以理解的,主要是由於子程式的呼叫和返回以及對區域性變數的理解不足。 遞迴被定義為呼叫自身的子例程,這也使其難以理解。 從本質上講,每次呼叫都會生成一組新的區域性變數,執行同一行並處理不同的資料(變數)。
不要把movetower子例程對movetower子例程的呼叫看作是對自身的呼叫,而是對另乙個子例程的呼叫(movetower可以多次編寫,每次呼叫都是用另乙個子例程寫的),可以手動分析每次呼叫的區域性變數的變化。
-
即一次將所有板材視為2塊板材,將底板視為一塊板材,其餘頂板均將其視為另一塊板材,然後可以將2塊板材的異常情況逐層應用。 此外,有必要寫下只有乙個盤子的情況。
-
堆疊與遞迴! 你去看看資料結構。
遞迴相互疊加,函式呼叫自己,直到出現約束。 該函式自行呼叫自己,可以理解為 sum = sum + m; 為此新增乙個迴圈以找到總和; 意思是同樣的自我調諧,河內塔更深,你可以用遞迴的方式找到所有數字的總和,多學幾遍,你自然會。 1. >>>More