遞迴漢諾塔《Blind Stab》

2021-09-25 14:45:55 字數 2238 閱讀 8750

函式遞迴

從**上來看 就是函式呼叫函式自己

遞迴有什麼好處呢?可以用最簡便的方式求解問題

遞迴有什麼壞處呢?過於深的遞迴會導致棧溢位異常

1)寫遞迴時,一定要先清楚合適開始歸(遞迴到那一層就應該停止)

2)遞迴主要是將大的問題逐步化解為小的問題進而解決

比較簡單經典的遞迴解法問題比如說遞迴求和?

//遞迴方法求前100項的和

public class demo

public static int sum(int n)

return n+sum(n-1); //遞迴}}

再比如說遞迴求斐波那契第n項

//遞迴求斐波那契前n項和

public class demo

public static int fibo(int n)

return fibo(n-1)+fibo(n-2); //遞

}}

再比如說漢諾塔問題

//漢諾塔移動盤子問題

public class hanno

public static void move(string from, string mid, string to,int level)else}}

關於漢諾塔這一題,我覺得很有必要細講。這可能是遞迴的真諦,或者說最好的應用。

比如說輸入3,也就是3個盤子,那麼程式執行結果如上,也就是移法如上。這裡from是從**移動,mid是需要借助的盤子,to是目的盤。關鍵是move函式,這裡應該用點逆向思維和整體思維去理解遞迴。下面我們來分析一下這個盤子怎麼去移動。

分析:

現在有三個底座a,b,c

我們解釋一下構造的遞迴函式裡的引數     move(args1

,args2,

args3

,args4),我們要知道前三個引數代表的都是底座第四個代表的是要操作盤子的個數。

第乙個引數args1,代表的是當前操作要移動盤子對應的底座。也就是從哪個底座移,也就是從args1處移。

第二個引數

args2

,代表的是

需要借助的位置,其實就是中介盤

。為了引數個數需要傳進來的。其實沒什麼l用。

第三個引數args3,代表的是當前移動盤子的目的地。也就是移到哪個底座去,也就是移動到arg4底座去。

第四個引數args4,代表的是你想移動的盤子的個數

1,首先要將所有得盤子從a移動到c,那必然要先將第n個盤子取出放到c。

2,想要將第n個盤子從a到c那必須先將前面n-1個盤子先放到b,這樣才可以移動c,所以再此之前我們得先寫上

move(from,to,mid,level-1);

3,這個時候第n個盤子終於可以被移動了,所有我們來了乙個

system.out.println(from+"->"+to);

4,好,剛才移動的第n個盤子已經到家了,那就不想她了,不管她了。

5,這個時候n-1個盤子在mid處,也就是在b那裡。我們是不是可以這樣想,也是相當於移動n-1個盤子,只不過換成了從b到c。

6,所以這裡是不是直接就是

move(mid,from,to,level-1);

7,但是最後必須要考慮乙個問題,也就是最後乙個盤子的時候怎麼移動,不就是直接移動嗎,判斷條件是level==1,直接

if()這樣就完成了

。乙個問題的實現若是想用遞迴,那麼它必然是有某種規律存在的,就是每個步驟必然有相似或者說迴圈的地方。

大問題用不了遞迴,不然會棧溢位,或者說遞了但是歸不了,所以是解決小問題的。

遞迴關鍵點兩個,第一是抽取公共點,可能是有某個公式。第二是要找到歸的條件,也就是判斷條件,這個條件一般會出現在頭或者尾。

遞迴其實也不好用啦,也就是簡化**量,比較靈活,能用就用,能不用就盡量不用。

漢諾塔 遞迴

個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。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...