遞迴詳解 二

2022-02-17 15:05:53 字數 2616 閱讀 4824

1

public

class

a ;6 permutation(ss, 0);7}

8public

static

void permutation(char ss, int

i) 13

if (i ==ss.length) else29}

30}31 }

這個遞迴執行結果很多很多,結果為14!。前6個結果為:

12345671234567

12345671234576

12345671234657

12345671234675

12345671234765

12345671234756

下面分析一下過程:

這麼講吧:

permutation(ss, i);//初始呼叫時,i值等於0

為了方便說,後面呼叫permutation函式時,i值等於幾,就叫幾號遞迴

permutation(ss, 0);//0號遞迴開始執行      判斷if條件語句不成立

執行else語句中的for迴圈,j=0,i<14, 

呼叫permutation(ss, 0+1);

permutation(ss, 0+1););//1號遞迴開始執行      判斷if條件語句不成立

執行else語句中的for迴圈,j=1,j<14, 

呼叫permutation(ss, 1+1);

permutation(ss, 13+1););//14號遞迴開始執行      判斷if條件語句成立

執行system.out.println(a); //a=12345671234567

14號遞迴不成立後,回歸13號遞迴的for迴圈處,進行j++處理,

執行for迴圈,j=14,j<14,不成立

13號遞迴不成立後,回歸12號遞迴的for迴圈處,進行j++處理,

執行for迴圈,j=13,j<14,成立。執行

char temp = ss[13];// 交換字首,使之產生下乙個字首

ss[13] = ss[12];

ss[12] = temp;

permutation(ss, 12 + 1);這段**執行完以後,13位和12位進行換位

permutation(ss, 12+1););//13號遞迴開始執行      判斷if條件語句不成立

執行else語句中的for迴圈,j=1,j<14, 

呼叫permutation(ss, 13+1);

permutation(ss, 13+1););//14號遞迴開始執行      判斷if條件語句成立

執行system.out.println(a); //a=12345671234576

描述起來挺麻煩,不再贅述,看圖的話會明了許多:

可以看出f(12)的入棧到出棧完成12位13位的排列;

可以看出f(11)的入棧到出棧完成11-13位的排列;

從而f(0)的入棧到出棧完成0-13位的排列;

排列過程也是有規律的,以567排列為例,先把5放首位,排列6,7;

再把6放首位,排列5,7;

最後把7放首位,排列5,6;這樣3個數的排列就完成啦。

也可以通過程式檢驗執行上面邏輯的正確性,在程式中加入變數和p和q,用來記錄入棧和出棧的次數:

system.out.println(p);

system.out.println(a);

system.out.println(q);**

*p++;

permutation(ss, i + 1);

q++;

下面給出前14組資料,讀者自己結合上圖揣摩規律

1 14

2 12345671234567

3 04 16

5 12345671234576

6 27 19

8 12345671234657

9 510 21

11 12345671234675

12 7

13 24

14 12345671234765

15 10

16 26

17 12345671234756

18 12

19 30

20 12345671235467

21 16

22 32

23 12345671235476

24 18

25 35

26 12345671235647

27 21

28 37

29 12345671235674

30 23

31 40

32 12345671235764

33 26

34 42

35 12345671235746

36 28

37 46

38 12345671236547

39 32

40 48

41 12345671236574

42 34

二叉樹遞迴詳解

請問這段 的執行步驟 重點是遞迴呼叫那段 最好每一步都寫出來 哪步哪個資料進棧,什麼時候出棧,請明白人來給講解一下。連題都看不懂的請一起等待答案。謝謝.重點是遞迴呼叫的部分,前面的結構就不用了。struct bitree void preorder struct bitree root void p...

java 遞迴詳解

example 求5的階乘。如下 public class test public static void main string args 上面的multiply是乙個階乘的例子。其實遞迴遞迴,從字面上解釋就是在方法本身呼叫自己的方法,或者間接呼叫 看上面的程式,拿multiply 5 來說 n ...

Java 遞迴詳解

遞迴詳解 1.遞迴一句話通俗講就是乙個方法自動重複呼叫自己的過程。2.因為是重複呼叫自己了,所以看起來像乙個迴圈,所以為了避免記憶體溢位系統崩潰,我們需要在方法裡加乙個返回值判斷,用於遞迴迴圈的跳出。下面用debug模式解釋一下遞迴的實現原理 首先是原始碼 public class demo8 pa...