全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1403
推到 Plurk!
推到 Facebook!

有關遞迴的問題

答題得分者是:Justmade
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-28 15:18:21 IP:211.75.xxx.xxx 未訂閱
我設計一個畫面,上面有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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-28 15:37:12 IP:218.16.xxx.xxx 未訂閱
自行呼叫時加入 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-28 15:44:43 IP:211.75.xxx.xxx 未訂閱
謝謝您的回答,請問為什麼會出現我說的那種情形呢? 我不瞭解的是已經給result值並且離開函式了, 卻好像還停留在function中
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-28 16:17:17 IP:218.16.xxx.xxx 未訂閱
你的程式不是只行一次的,你看看若 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-28 16:38:49 IP:211.75.xxx.xxx 未訂閱
謝謝你的解說,這下了解了。
系統時間:2024-05-04 2:08:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!