遞迴的問題 |
答題得分者是:Coffee
|
jere
一般會員 發表:3 回覆:7 積分:2 註冊:2006-08-31 發送簡訊給我 |
在一個遞迴要找出一顆樹下的全部葉節點,當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 發送簡訊給我 |
|
jere
一般會員 發表:3 回覆:7 積分:2 註冊:2006-08-31 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
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 發送簡訊給我 |
謝謝版主,測出來了,只是不知有沒有更好的做法呢? 版主你所說的電子書是放在那裡呢?謝謝~
<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> |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
jere
一般會員 發表:3 回覆:7 積分:2 註冊:2006-08-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |