線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3087
推到 Plurk!
推到 Facebook!

遞迴的問題

答題得分者是:Coffee
jere
一般會員


發表:3
回覆:7
積分:2
註冊:2006-08-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-16 13:47:47 IP:59.124.xxx.xxx 訂閱
在一個遞迴要找出一顆樹下的全部葉節點,當OrgFlag=1為葉節點,做一個update
,當OrgFlag=0為子節點,再往下找節點,但找到根之第二個節點符合OrgFlag=1為葉節點,做一個update,就會直接跳離遞迴

<textarea cols="60" rows="10" class="delphi" name="code"> function OrgBonus(Id ,CurrentId, Status, BonusYear, BonusMonth : integer) : integer; var childId,subno : integer; //subno begin subno:=1; Result := 0; childId:=FindOrgChild(Id,subno,BonusYear, BonusMonth);//往下找下一個節點 if (childId = 0) then begin // node 根本沒有任何子節點 所以她是葉節點 if FindOrgFlag(Id, BonusYear, BonusMonth)=1 then begin Orgupdate(Id,CurrentId, Status, BonusYear, BonusMonth); // update end; end else begin while childId <> 0 do begin if FindOrgFlag(childId, BonusYear, BonusMonth)=1 then begin//遇到OrgFlag=1就代表也是葉節點,也做update Orgupdate(childId,CurrentId, Status, BonusYear, BonusMonth); exit; //有問題的部份,當遇到根之第二層符合時,就結束遞迴 end else begin OrgBonus(childId,CurrentId, Status, BonusYear, BonusMonth); inc(subno); childId:=FindOrgChild(Id,subno, BonusYear, BonusMonth);//往下找下一個節點 end; end;//while childId <> 0 end;//if (childId = 0) end; </textarea>

請問是那裡有問題呢?謝謝~
編輯記錄
jere 重新編輯於 2007-08-16 15:17:39, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-16 20:55:51 IP:61.217.xxx.xxx 訂閱
如果你自己都有辦法把註解註出來,那我想trace程式應該也不難,
自己先拿顆樹塞進去作單步追蹤應該不難找出問題,不要奢望別人幫你debug.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
jere
一般會員


發表:3
回覆:7
積分:2
註冊:2006-08-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-17 11:05:25 IP:59.120.xxx.xxx 訂閱
因為不確定delphi是否支援遞迴,在程式的16行,在C是用return  
而在delphi內好像只能用exit 或break,因為只要不符合根的第二層符合14行之判斷時,
就會跳出整個遞迴,有單行trace,但找不出為何符合根的第二層就會跳出整個遞迴,sorry,因為對delphi與遞迴都不太熟,麻煩大家了~
編輯記錄
jere 重新編輯於 2007-08-17 11:13:15, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-17 11:13:29 IP:220.130.xxx.xxx 訂閱
Delphi支援遞迴,如果你需要類似return的機制,就只能先呼叫,再Exit,
Delphi對於回傳值的操作提供了一個alias變數,叫Result,或者是用該函式名稱。
所以你若是需要C中的
return fxxx(a);
在Delphi中就要寫成
result:= fxxx(a);
Exit;

Debug,還是自己來吧,站上有放一本不用錢的Pascal電子書可以參考。
不熟,還是學一下吧,總比事事靠別人的好。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-17 11:15:15, 註解 無‧
jere
一般會員


發表:3
回覆:7
積分:2
註冊:2006-08-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-17 14:22:02 IP:59.120.xxx.xxx 訂閱
謝謝版主,測出來了,只是不知有沒有更好的做法呢?  版主你所說的電子書是放在那裡呢?謝謝~
<textarea cols="60" rows="10" class="delphi" name="code"> function OrgBonus(Id ,CurrentId, Status, BonusYear, BonusMonth : integer) : integer; var childId,subno : integer; //subno begin subno:=1; Result := 0; childId:=FindOrgChild(Id,subno,BonusYear, BonusMonth);//往下找下一個節點 if (childId = 0) then begin // node 根本沒有任何子節點 所以她是葉節點 if FindOrgFlag(Id, BonusYear, BonusMonth)=1 then begin Orgupdate(Id,CurrentId, Status, BonusYear, BonusMonth); // update end; end else begin while childId <> 0 do begin if FindOrgFlag(childId, BonusYear, BonusMonth)=1 then begin//遇到OrgFlag=1就代表也是葉節點,也做update Orgupdate(childId,CurrentId, Status, BonusYear, BonusMonth); if id=CurrentId then begin inc(subno); childId:=FindOrgChild(Id,subno, BonusYear, BonusMonth); OrgBonus(childId,CurrentId, Status, BonusYear, BonusMonth); end else exit; end else begin OrgBonus(childId,CurrentId, Status, BonusYear, BonusMonth); inc(subno); childId:=FindOrgChild(Id,subno, BonusYear, BonusMonth);//往下找下一個節點 end; end;//while childId <> 0 end;//if (childId = 0) end; </textarea>
編輯記錄
jere 重新編輯於 2007-08-17 14:23:23, 註解 無‧
jere 重新編輯於 2007-08-17 14:24:31, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-17 14:40:17 IP:220.130.xxx.xxx 訂閱
精通PASCAL書一本

發問前請搜尋與查閱相關書籍。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
jere
一般會員


發表:3
回覆:7
積分:2
註冊:2006-08-31

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