b94902xxx 板


LINE

幫了幾個求助之後, 發現大家的一個大問題是: 到底return會回到哪裡去? 我們先用一個簡單的函數呼叫的例子來看好了: void a(int x); int b(int y); int main(void) { int c; a(5); /*[A]*/ printf("a returns %d\n",c); return 0; } void a(int x) { int d; printf("%d + %d = %d\n",x,x,x+x); d=b(x); /*[B]*/ printf("b returns %d\n",d); return; } int b(int y) { printf("%d * %d = %d\n",y,y,y*y); return y+5; } 好,我們在main呼叫了a(5); 然後a裡面呼叫了b(x); 然後b做完,return了一個值, 請問b的return會回到哪裡? 1. main的開始 2. a的開始 3. b的開始 4. 標[A]的地方 5. 標[B]的地方 6. 以上皆非 . . . . 答案是5. 標[B]的地方。 所謂return, 就是回到呼叫自己的那個人的地方, 也就是說剛剛誰呼叫我,現在我做完了,換你繼續。 因此,在上面這個例子中,呼叫b()的是標[B]的地方那個人(就是a), 於是這裡的return就回到那邊去。 同理,a()的return所回到的地方,就是叫a()的那個人,也就是標[A]的地方。 那這裡a它return給main什麼呢? 一個訊息: a我已經做完了,你可以繼續做。 現在來看遞迴呼叫的情形: int main(void) { int s; s=sum(5); /*[C]*/ printf("sum of 1 to 5 is %d.\n",d); return 0; } int sum(int x) { if(x==1) return 1; else return x+sum(x-1); /*[D]*/ } 在這個情形中,sum自己呼叫自己, 所以有人就搞混了: 到底sum的return會回到哪裡去? 是回到[C]? 還是回到[D]? 答案是: 要看是誰叫他們的。 在上面的例子中,main在[C]的地方先呼叫了一個sum(5), 於是sum就跳了一個分身出來叫sum(5),來處理main的呼叫。 然後sum(5)看到要他算5+sum(4),所以在[D]的地方呼叫了sum(4), 這個時候sum又跳了一個分身出來叫sum(4),來處理sum(5)的呼叫。 然後sum(4)看到要算4+sum(3),又呼叫了sum(3), 所以sum又跳了sum(3)這個分身出來, sum(3)要算3+sum(2),呼叫sum(2),sum跳出sum(2)分身, sum(2)要算2+sum(1),呼叫sum(1),sum再跳出sum(1)分身, 最後sum(1)看到自己要算的是1,這他可以算, 然後他要把這個值return回去。return給誰呢? sum(1)看一看是誰叫他的。是sum(2),所以他把這個值給了sum(2)。 sum(2)看到他要的sum(1)已經算好給他了(是1), 於是他就算他的2+sum(1)=2+1=3。 算好了要return,return給誰? sum(2)看誰叫他的。是sum(3),所以他把3給了sum(3)。 就這樣一直算,一直return,到最後sum(5)終於完成了他的任務,算出答案(15), 然後他也要return,這次他看到是main叫他的,所以他把15給了main。 main得到答案15 就高興的printf出來: sum of 1 to 5 is 15. 這樣子各位有比較了解return到底回到哪裡去了嗎? 使徒四的密技中,助教這樣寫: : if (不是數字0) { : 往下試; : } else { : 記錄已經被使用過的數字(行, 列, local九宮格); : for each available number i do : { : 填 i; : 往下試; : 填回 0; : } : } 這所謂的"往下試",其實就是叫另一個分身出來去試著填下一個位置。 那分身要怎麼告訴你後面是有路還是沒路呢? 這就是分身的return。 如果我們這樣設定: 只要我找到答案了,直接印答案之後結束程式, 那我們在函數最後(確定此後沒路了)寫上return; 那麼當分身試完,發現沒路了, 他就會告訴上一個分身: "我這裡已經確定沒路了,你可以繼續試下一個", 叫人的分身知道了後面沒路,自己就換一下填的數字,再叫那個分身出來試試看。 如果在後面分身處理沒路時,你又叫了一個分身出來,告訴他處理前面, 新叫的分身可不會知道原來的分身做了什麼,他會重頭開始做, 所以就會一直呼叫呼叫……, 到最後查克拉(stack)不夠就會累掛了(stack overflow)。 這樣有比較清楚要怎麼做了嗎? -- "LPH" is for "Let Program Heal us".... --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.240.54
1F:推 alex1025:雖然我是雙班的~你寫的很清晰易懂~連我這個弱者都看的懂. 10/17 23:14
2F:推 NeantD:推 10/17 23:24
3F:→ yjpetergto:推..這個問題困擾了我好久...謝謝 10/17 23:26
4F:推 frankfbo:看了怎可不推~ 10/17 23:48
5F:推 IamrealBB:恩,有看有推XD 10/17 23:55
6F:推 sa033766:高手 推 10/17 23:55
※ 編輯: LPH66 來自: 140.112.240.54 (10/18 00:03)
7F:→ LPH66:囧 我發現我忘了加還原碼 已經加上去了 10/18 00:03
8F:推 SadCrusader:推~~~~~ 10/18 00:21
9F:推 hamigwa:GooooooooooooooooooooooooD 10/18 00:44
10F:推 springgod:提醒一下萬一分了兩次sum(4)出來 他們還是不一樣的喔:) 10/18 10:18
11F:→ springgod:詳情可以上p老師的ACP-DP會教怎麼運用更強大的影分身XD 10/18 10:19
12F:推 anauma:推~~強者風範! 謝謝指導 10/18 10:25
13F:推 pangfeng:可以轉到Sandbox嗎? 10/19 19:12







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP