![]() |
||
|
Regular Member
![]() ![]() 加入日期: Nov 2003
文章: 84
|
程式問題(含程式碼以及圖片)
程式碼如下
========================================================= #include <iostream.h> void wwww(int *a,int f,int t) { int i=f; int j=t; int mid=(f+t)/2; int key=a[mid]; int c=0; cout << "f=" << f << " " << "t=" << t << " "; cout << "\n"; do{ while(a[i] < key) i++; while(a[j] > key) j--; if(i <= j) { int temp=a[i]; a[i]=a[j]; a[j]=temp; i++; j--; } for(c=0;c<=5;c++) cout << a[c] << " "; cout << "i=" << i << " " << "j=" << j << " "; cout << "\n"; } while(i <= j); if(f < j) wwww(a,f,j); if(i < t) wwww(a,i,t); } void main() { int a[6],i; for(i=0;i<=5;i++) cin >> a[i]; wwww(a,0,5); for(i=0;i<=5;i++) cout << a[i] << " "; cout << "\n"; } ============================================================ 為什麼結果的第14行i=1 ; j=-1 在if的判斷不是就false了 為什麼還會有第15行的f=2 ; t=4 為什麼呢?? 請會的人告訴我 拜託 很急 一直想不出來 謝謝大家 |
|||||||
|
|
|
Regular Member
![]() ![]() 加入日期: Nov 2003
文章: 84
|
推到上面去
|
||
|
|
|
Elite Member
![]() ![]() ![]() ![]() ![]() 加入日期: Jul 2004 您的住址: 無止盡的文件地獄~~
文章: 4,714
|
引用:
你說的if是哪邊的??? 這個wwww裡面最後還有兩個if判斷去遞迴呼叫他自己.... 當你對程式流程有疑問的時候,自己用中斷去追蹤是最快的做法..... |
|
|
|
|
Regular Member
![]() ![]() 加入日期: Nov 2003
文章: 84
|
謝謝了
已經用中斷點去跑程式 也看到結果 大概知道怎麼分析 但還有一個問題 因為沒人交過觀念 所以我再問一下好了 void wwww(a,b) { ............ ............ if (g1<g2) wwww(c,d);.........(1) if (g1>g2) wwww(x,y);.........(2) }...........................................(3) 當第一次執行到第(1)這一行時,又會在call一次wwww(a,b); 那麼當程式執行完畢(3)(兩個if判斷是都沒有成立時,),程式是不是又會回到(2)這一行再判斷一次呢??? 然後又執行到(3)完畢。 |
|
|
|
Elite Member
![]() ![]() ![]() ![]() ![]() 加入日期: Jul 2004 您的住址: 無止盡的文件地獄~~
文章: 4,714
|
引用:
這就是所謂的遞迴...... 首先在void main()這邊,for(i=0;i<=5;i++) cin >> a[i]; wwww(a,0,5); 這個FOR迴圈會去把A陣列裡的每個元素依序取出,然後去呼叫wwww,wwww後面括弧的三個參數a、0、5就是傳進wwww的參數, 接下來再wwww副程式裡面..... } while(i <= j); if(f < j) wwww(a,f,j); if(i < t) wwww(a,i,t); } 當i小於等於j的時候,會去重新呼叫自己,然後傳不一樣的參數進去 把這兩行跟主程式那一行FOR迴圈呼叫的參數比對一下,就知道差在哪邊了..... |
|
|
|
|
Regular Member
![]() ![]() 加入日期: Nov 2003
文章: 84
|
妳的意思我懂了
那程式的流程是否為 一開始假設g1<g2 , 執行完第一次的wwww(c,d) g1=g2 從......開始-->然後(1)符合判斷式-->......-->(1)不符合-->(2)不符合-->(3)-->再回到(2)不符合-->(3) |
|
|
|
Elite Member
![]() ![]() ![]() ![]() ![]() 加入日期: Jul 2004 您的住址: 無止盡的文件地獄~~
文章: 4,714
|
引用:
那個g1、g2的值,是wwww副程式裡面處理過的,依據後面if判斷之後遞迴呼叫所傳進去的值,又會再產生新的g1、g2...... |
|
|
|