[問題] 請問C++的return

看板C_and_CPP (C/C++)作者 (keep going)時間12年前 (2014/04/04 23:11), 編輯推噓4(409)
留言13則, 4人參與, 最新討論串1/1
各位板大好,小弟還是C++的新手,想請教關於return值的跑法 下面程式最左邊是我key的編號,想請問在最下面輸出結果的編號43~46 在debug裡,一行行逐步執行的時候發現,只是在重覆執行27、28行的程式 為什麼會有這現象呀? 在第28行return ii的時候,不是應該回傳到main嗎 怎麼會跑到27行去列印? 而且在什麼時候才會列印出 main()裡的35、36行呢? (就是當什麼條件成立時才會輸出編號47、58的結果) 問題有點多,也許是我的程式觀念有問題,麻煩知道的高手幫我解惑了 m(_ _)m 1 #include <iostream> 2 using namespace std; 3 4 int binsearch(int *dset, int ib, int ie, int data) 5 { 6 cout << "search: ib = " << ib << ", ie = " << ie << endl; 7 int ii; 8 9   if (ib > ie) 10  { 11 ii = -1; 12 } 13 else 14 { 15 ii = (ib + ie) / 2; 16 17 if (dset[ii] > data) 18 { 19 ii = binsearch(dset, ib, ii-1, data); 20 } 21 else if (dset[ii] < data) 22 { 23 ii = binsearch(dset, ii+1, ie, data); 24 }; 25 }; 26 27 cout <<"search ib = "<<ib<<", ie = "<<ie<<" return: "<<ii<<endl; 28 return ii; 29 } 30 31 int main() 32 { 33 int dset[] = {1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33}; 34 35 cout << "Final data 13 is at: " << binsearch(dset,0,15,13) << endl; 36 cout << "Final data 20 is at: " << binsearch(dset,0,15,20) << endl; 37 return 0; 38 } ===================================================================== 輸出結果: 39 search: ib = 0, ie = 15 40 search: ib = 0, ie = 6 41 search: ib = 4, ie = 6 42 search: ib = 6, ie = 6 43 search ib = 6, ie = 6 return: 6 44 search ib = 4, ie = 6 return: 6 45 search ib = 0, ie = 6 return: 6 46 search ib = 0, ie = 15 return: 6 47 Final data 13 is at: 6 48 search: ib = 0, ie = 15 49 search: ib = 8, ie = 15 50 search: ib = 8, ie = 10 51 search: ib = 10, ie = 10 52 search: ib = 10, ie = 9 53 search ib = 10, ie = 9 return: -1 54 search ib = 10, ie = 10 return: -1 55 search ib = 8, ie = 10 return: -1 56 search ib = 8, ie = 15 return: -1 57 search ib = 0, ie = 15 return: -1 58 Final data 20 is at: -1 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.206.193.250 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1396624270.A.58B.html

04/05 00:26, , 1F
因為遞迴的關西,28行的retrun,會回傳給呼叫他的人
04/05 00:26, 1F

04/05 00:32, , 2F
當行35所有的遞迴都跑完的時候就會輸出標號47
04/05 00:32, 2F

04/05 00:34, , 3F
建議拿紙把每行的結果寫下來你就會懂遞迴的感覺了~
04/05 00:34, 3F

04/05 01:43, , 4F
我最近喜歡說遞迴就是數學歸納法, 遞迴呼叫就是參數比較小
04/05 01:43, 4F

04/05 01:43, , 5F
的狀況, 原 PO 可以試著用這種方式理解遞迴看看
04/05 01:43, 5F

04/05 13:35, , 6F
遞迴這部份我還不熟,想請問44行的ib值為什麼從6變成4呀?
04/05 13:35, 6F

04/05 18:40, , 7F
42-43行是 ib=6,ie=6 的結果, 41&44行是 ib=4,ie=6 的結果
04/05 18:40, 7F

04/05 18:41, , 8F
後者在第 23 行使用了前者的結果, 如此而已
04/05 18:41, 8F

04/05 18:42, , 9F
這就是我所謂的「數學歸納法」: 這裡「比較小」的狀況是
04/05 18:42, 9F

04/05 18:42, , 10F
ib,ie 的範圍比較小的狀況而已
04/05 18:42, 10F

04/06 15:08, , 11F
簡單點說的話,那就是 28 不只return 給main 也會return 給
04/06 15:08, 11F

04/06 15:08, , 12F
binsearch 這個function
04/06 15:08, 12F

04/09 00:06, , 13F
感謝各位的回應,已經完全理解這題遞迴的跑法了,感謝Orz
04/09 00:06, 13F
文章代碼(AID): #1JFikEMB (C_and_CPP)
文章代碼(AID): #1JFikEMB (C_and_CPP)