有關遞迴的問題 |
答題得分者是:Justmade
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
我設計一個畫面,上面有edit1,edit2,edit3,button1
在edit1,edit2裡面各填一個數,按下buttton1后,
會呼叫function Sam(a,b) ,計算兩個數的最大公因數,並且show在edit3上。
sam 中
引言: Result := 0; if b = 0 then begin result := a; exit; end else SAM(b,(a mod b));若於button.OnClick接收其傳回值,再assign給edit3, 其收到值 = 0,但是trace的時候, 確實有走到 Result := a 這行 若然將函式改成 引言: Result := 0; if b = 0 then begin result := a; edit3.text := inttostr(a); exit; end else SAM(b,(a mod b));則OK,請問各位這是什麼道理? |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
自行呼叫時加入 result := 就完全正確啦
procedure TForm1.Button1Click(Sender: TObject); function Sam(a,b : integer) : integer; begin Result := 0; if b = 0 then begin result := a; exit; end else result := SAM(b,(a mod b)); end; begin Edit3.Text := IntToStr(Sam(StrToInt(Edit1.Text),StrToInt(Edit2.Text))); end; |
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
你的程式不是只行一次的,你看看若 b 不等於 0 時他是會再呼叫自己去計算,直到 b = 0 為止。 但是當你的程式呼叫自己 SAM(b,(a mod b)) 繼續計算時,你沒有用 result := 來接受該呼叫回傳的值,那時 Result 仍然是 0 (第一行程式) 所以就回傳 0 了。 例 a = 6, b = 3
第一次呼叫 SAM(6.3)
一的 result := 0
一的 b(3) <> 0
第二次呼叫 SAM (3,0)
二的 result := 0
二的 b(0) = 0
二的 result := 3
這時一的 result 仍是 = 0, 因你沒把第二次呼叫 SAM 的result提出
所以 Edit3 就會得到一的 result, 即是 0 了。
若你加上
result := SAM(b,(a mod b));
這樣二的 result 就會給與 一的 result 而正確地傳回 3 了。
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |