資料結構~遞迴(Recursion) |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
主題:資料結構~遞迴(Recursion)
作者:李信宏(Delphi K.Top討論區站長)
日期:2002/08/27 [何謂遞迴]
簡單的說:函數之中有呼叫自身函數的方式稱之.
定義遞迴:一個遞迴函數必定具備以下兩種特性:
1.具有終止遞迴呼叫的條件.
2.一個可以將問題逐次簡化的處理,最後問題將簡化至符合終止遞迴的條件. [一個最簡單的遞迴範例]
用遞迴函數來計算出N階乘的值(N!)
// N階乘的值
function NClass(N:integer):integer; begin if N<=1 then Result:=N // 1.具有終止遞迴呼叫的條件. else Result:=N*NClass(N-1) // 2.一個可以將問題逐次簡化的處理 end;使用舉例: procedure TForm1.Button1Click(Sender: TObject); begin caption:=inttostr(NClass(6)); end;最後Form1的caption會填入720(6*5*4*3*2*1=720) [第二個範例:列出子目錄] 用遞迴函數來列出指定資料夾內所有的子目錄名稱 // 列出子目錄 procedure Dirs(path:string); var f:tSearchrec; begin form1.Memo1.Lines.add(path); // 將子目錄列在Memo1上 if FindFirst(path '*.*',$0000001F,f)=0 then // 若有找到目錄名稱 begin repeat if (trim(f.name)<>'.') and (trim(f.name)<>'..') then // 找到正式的目錄名稱後再呼叫自身函數 Dirs(path f.name '\'); // 將下一曾的子目錄名稱傳入自身函數中(問題簡化) until findnext(f)<>0; // 找下一個目錄名稱 FindClose(f); // 關掉FindFirst end; end;使用舉例: procedure TForm1.Button2Click(Sender: TObject); begin Dirs('C:\'); end;最後Form1.Memo1中會填上所有C:\中的子目錄名稱 下一次介紹"河內塔". ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
coldcoffee
一般會員 發表:60 回覆:22 積分:16 註冊:2003-05-23 發送簡訊給我 |
引言: 主題:資料結構~遞迴(Recursion) 作者:李信宏(Delphi K.Top討論區站長) 日期:2002/08/27 [何謂遞迴] 簡單的說:函數之中有呼叫自身函數的方式稱之. 定義遞迴:一個遞迴函數必定具備以下兩種特性: 1.具有終止遞迴呼叫的條件. 2.一個可以將問題逐次簡化的處理,最後問題將簡化至符合終止遞迴的條件. [一個最簡單的遞迴範例] 用遞迴函數來計算出N階乘的值(N!) // N階乘的值红色的部分应该改成如下: if (trim(f.name)<>'.') and (trim(f.name)<>'..') and (f.Attr=faDirectory) then 發表人 - coldcoffee 於 2004/01/14 18:22:50function NClass(N:integer):integer; begin if N<=1 then Result:=N // 1.具有終止遞迴呼叫的條件. else Result:=N*NClass(N-1) // 2.一個可以將問題逐次簡化的處理 end;使用舉例:procedure TForm1.Button1Click(Sender: TObject); begin caption:=inttostr(NClass(6)); end;最後Form1的caption會填入720(6*5*4*3*2*1=720) [第二個範例:列出子目錄] 用遞迴函數來列出指定資料夾內所有的子目錄名稱 // 列出子目錄procedure Dirs(path:string); var f:tSearchrec; begin form1.Memo1.Lines.add(path); // 將子目錄列在Memo1上 if FindFirst(path '*.*',$0000001F,f)=0 then // 若有找到目錄名稱 begin repeat if (trim(f.name)<>'.') and (trim(f.name)<>'..') then // 找到正式的目錄名稱後再呼叫自身函數 Dirs(path f.name '\'); // 將下一曾的子目錄名稱傳入自身函數中(問題簡化) until findnext(f)<>0; // 找下一個目錄名稱 FindClose(f); // 關掉FindFirst end; end;使用舉例:procedure TForm1.Button2Click(Sender: TObject); begin Dirs('C:\'); end;最後Form1.Memo1中會填上所有C:\中的子目錄名稱 下一次介紹"河內塔". ~~~Delphi K.Top討論區站長~~~ |
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
marky1
一般會員 發表:17 回覆:29 積分:9 註冊:2003-03-19 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 請教一下: 在實際應用上, 遞迴有何優點與缺點? 在什麼情形下用會比較好? 例如增快運算速度 反之,在什麼情形絕對不能用? 例如會將記憶體耗盡優點:簡潔的思考邏輯,簡化複雜的問題 缺點:執行速度慢,佔用記憶空間大 應用面很多,遊戲的AI,Compiler的語法分析,數學運算式... 使用遞迴一般來說並不會增快速度 什麼情形絕對不能用?不需要用遞迴就可以解決時就不要用. ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
baby2321
初階會員 發表:52 回覆:165 積分:48 註冊:2005-06-11 發送簡訊給我 |
站長大大:
不好意思 我在数据库(DELPHI)专区问了一个关于如何计算treeview结构数据汇总的问题 里面可能涉及到遞迴(Recursion) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=77868
Mickey版主 谈到用Recursion来计算treeview结构数据汇总 而我一直没有从
“declare code cursor for select 代码 from 公司表 where ...
open code
fetch code into @code while @@fetch_status=-2
select @code=rtrim(@code) '%'”的模式中走出来
如有可能 请站长大大多指点 多谢
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |