程式追蹤 |
尚未結案
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
void permute(char a[], int k, int input_var) { int i,j, inversion=0; char temp; if ( k == input_var ) { printf("("); for ( i=1; i<input_var; i ) printf(" %d,",a[i]); printf(" %d )",a[i]); for ( i=1; i<=input_var; i ) for ( j = i 1; j<=input_var; j ) if (a[i] > a[j]) inversion ; printf(" Inversion = -, ",inversion); if ( (inversion %2) == 1 ) printf("odd permutation.\n"); else printf("even permutation.\n"); } else { for ( i=k; i<=input_var; i ) { temp=a[k]; a[k]=a[i]; a[i]=temp; permute ( a, k 1, input_var); temp=a[k]; a[k]=a[i]; a[i]=temp; } } } int main(int argc, char* argv[]) { int i, input_var; char setofnumber[10], ch; for (i=0; i<10; i ) permute ( a, k 1, input_var); temp=a[k]; a[k]=a[i]; a[i]=temp; } } } int main(int argc, char* argv[]) { int i, input_var; char setofnumber[10], ch; for (i=0; i<10; i ) setofnumber[i]=i; printf("Please input the number of entries to permute\n"); scanf("%d",&input_var); permute(setofnumber, 1, input_var); return 0; } 上面是完整程式碼 ____________________________________________________________________ 下面這程式是怎麼跑的~~可以跟我說明一下 好像是利用遞迴嗎?? void permute(char a[], int k, int input_var) { int i,j, inversion=0; char temp; if ( k == input_var ) { printf("("); for ( i=1; i<input_var; i ) printf(" %d,",a[i]); printf(" %d )",a[i]); for ( i=1; i<=input_var; i ) for ( j = i 1; j<=input_var; j ) if (a[i] > a[j]) inversion ; printf(" Inversion = -, ",inversion); if ( (inversion %2) == 1 ) printf("odd permutation.\n"); else printf("even permutation.\n"); } else { for ( i=k; i<=input_var; i ) { temp=a[k]; a[k]=a[i]; a[i]=temp; permute ( a, k 1, input_var); temp=a[k]; a[k]=a[i]; a[i]=temp; } } }發表人 - syao 於 2005/03/20 18:03:13 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
|
Fm
初階會員 發表:19 回覆:66 積分:37 註冊:2003-10-15 發送簡訊給我 |
妳好
這程式遞迴終止條件是什麼??--
{ ............. } else { for ( i=k; i<=input_var; i ) { temp=a[k]; a[k]=a[i]; a[i]=temp; permute ( a, k 1, input_var); temp=a[k]; a[k]=a[i]; a[i]=temp;//當這裡在做排列的動作 } }當i>input_var遞回就終止了.. //妳可以自己設中斷點(Ctrl F5)..然後按F8慢慢trace程式 //觀察i,k,變數(Ctrl F5),應該可以得到你要的答案 //以上是BCB的操作方式 //------------------- 原來喜歡一個人是很辛苦的 |
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
|
Fm
初階會員 發表:19 回覆:66 積分:37 註冊:2003-10-15 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
Please input the number of entries to permute 3 k=1,i=1 k=2,i=2 ( 1, 2, 3) Inversion = 0, even permutation. k=2,i=2 k=2,i=3 ( 1, 3, 2) Inversion = 1, odd permutation. k=2,i=3 k=1,i=1 k=1,i=2 k=2,i=2 ( 2, 1, 3) Inversion = 1, odd permutation. k=2,i=2 k=2,i=3 ( 2, 3, 1) Inversion = 2, even permutation. k=2,i=3 k=1,i=2 k=1,i=3 k=2,i=2 ( 3, 2, 1) Inversion = 3, odd permutation. k=2,i=2 k=2,i=3 ( 3, 1, 2) Inversion = 2, even permutation. k=2,i=3 k=1,i=3 請按任意鍵繼續 . . . 這我追蹤k&i的變化 加了下面紅色兩行來追蹤 for ( i=k; i<=input_var; i ) { printf("k=%d,i=%d\n",k,i); temp=a[k]; a[k]=a[i]; a[i]=temp; permute ( a, k 1, input_var); temp=a[k]; a[k]=a[i]; a[i]=temp; printf("k=%d,i=%d\n",k,i); } 我還是搞不懂遞迴控制權的是怎麼還原的 k=3 ( 1, 2, 3) Inversion = 0, even permutation. 這邊可以看懂~~ 那之後是不是遞迴把k變回=2??? 那k=2是又從void permute{}從起執行嗎???我這樣看起來怪怪的~~@@ 還是遞迴還原k=2是從下面這邊執行但我還是看不懂&如果從遞迴還原從這邊開始(1,3,2)好像是~~但(2,1,3)這邊我又搞不懂是如何變出來的@@ for ( i=k; i<=input_var; i ) { temp=a[k]; a[k]=a[i]; a[i]=temp; permute ( a, k 1, input_var); temp=a[k]; a[k]=a[i]; a[i]=temp; } |
pkdemon
初階會員 發表:2 回覆:51 積分:25 註冊:2004-09-13 發送簡訊給我 |
syao 你好, 感覺上你似乎不太清楚遞迴的運作,建議加上一個Counter來幫助了解(下面紅色處) 另外,這個程式是要把一個字串反轉嘛??
void permute(char a[], int k, int input_var, int Counter) { int i,j, inversion=0; char temp; printf("Counter = %d\n", Counter); if ( k == input_var ) { ........ } else { for ( i=k; i<=input_var; i ) { temp=a[k]; a[k]=a[i]; a[i]=temp; permute ( a, k 1, input_var, Counter 1); temp=a[k]; a[k]=a[i]; a[i]=temp; } } } int main(int argc, char* argv[]) { ........ permute(setofnumber, 1, input_var, 0); ........ } |
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
pkdemon您好: 這程式是要把數值所有排列組合數都顯示出來~~ 例如輸入:3 會印出 (1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,1,2) (3,2,1) ___________________________________________ 沒錯我對遞迴關係不是很清楚~~ 我只知道遞迴是以stack方式達成~ 至於剛到達終止條件要在返回上一層呼叫的值這怎麼跑我這懂不太懂 遞迴終止後回上層呼叫void re(int a)不在從這開始嗎?? 只是這行開始執行嗎???cout< using namespace std; void re(int); int main() { re(4); system("pause"); return 0; } void re(int a) { cout<<"countdown down....."<0) re(a-1); cout< |
pkdemon
初階會員 發表:2 回覆:51 積分:25 註冊:2004-09-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |