1這個遞迴執行結果很多很多,結果為14!。前6個結果為:public
class
a ;6 permutation(ss, 0);7}
8public
static
void permutation(char ss, int
i) 13
if (i ==ss.length) else29}
30}31 }
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);下面給出前14組資料,讀者自己結合上圖揣摩規律system.out.println(a);
system.out.println(q);**
*p++;
permutation(ss, i + 1);
q++;
1 142 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...