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

資料結構~遞迴(Recursion)

 
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-27 08:41:47 IP:61.219.xxx.xxx 未訂閱
主題:資料結構~遞迴(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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-14 17:27:25 IP:61.51.xxx.xxx 未訂閱
引言: 主題:資料結構~遞迴(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討論區站長~~~
红色的部分应该改成如下: if (trim(f.name)<>'.') and (trim(f.name)<>'..') and (f.Attr=faDirectory) then 發表人 - coldcoffee 於 2004/01/14 18:22:50
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-14 20:34:55 IP:192.168.xxx.xxx 未訂閱
引言: q色的部分G改成如下: if (trim(f.name)<>'.') and (trim(f.name)<>'..') and (f.Attr=faDirectory) then
感謝修正! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
marky1
一般會員


發表:17
回覆:29
積分:9
註冊:2003-03-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-19 18:18:12 IP:140.118.xxx.xxx 未訂閱
請教一下: 在實際應用上, 遞迴有何優點與缺點? 在什麼情形下用會比較好? 例如增快運算速度 反之,在什麼情形絕對不能用? 例如會將記憶體耗盡
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-19 18:56:07 IP:192.168.xxx.xxx 未訂閱
引言: 請教一下: 在實際應用上, 遞迴有何優點與缺點? 在什麼情形下用會比較好? 例如增快運算速度 反之,在什麼情形絕對不能用? 例如會將記憶體耗盡
優點:簡潔的思考邏輯,簡化複雜的問題 缺點:執行速度慢,佔用記憶空間大 應用面很多,遊戲的AI,Compiler的語法分析,數學運算式... 使用遞迴一般來說並不會增快速度 什麼情形絕對不能用?不需要用遞迴就可以解決時就不要用. ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
baby2321
初階會員


發表:52
回覆:165
積分:48
註冊:2005-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-24 17:57:21 IP:219.139.xxx.xxx 未訂閱
站長大大: 不好意思 我在数据库(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) '%'”的模式中走出来 如有可能 请站长大大多指点 多谢
系統時間:2024-05-06 8:25:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!