Đệ qui trong Pascal

Thứ năm - 06/08/2020 09:42
- Một đối tượng gọi là đệ qui nếu có bao gồm chính nó như một bộ phận hoặc nó được định nghĩa dưới dạng chính nó.
1. KHÁI NIỆM
- Một đối tượng gọi là đệ qui nếu có bao gồm chính nó như một bộ phận hoặc nó được định nghĩa dưới dạng chính nó.
■ Ví dụ:
a) Số tự nhiên:
• 1 là một số tự nhiên.
• X là số tự nhiên nếu x - 1 là số tự nhiên.
b) Hàm n giai thừa: n !
• 0 ! = 1
• Nếu n > 0 thì n ! = n(n - 1) !

2. THỦ TỤC ĐỆ QUI
- Một thủ tục được gọi là đệ qui nếu trong quá trình thực hiện nó có phần phải gọi đến chính nó nhưng với kích thước nhỏ hơn của tham số.
■ Ví dụ: Function GT (n: word) : longint;
    Begin
         if n := 0 then GT := else
         GT := n*GT(n - 1);
    end;

3. CẤU TRÚC CỦA MỘT THỦ TỤC ĐỆ QUI
Một thủ tục đệ qui luôn gồm hai phần:
- Phần neo: Trong đó chứa các tác động của hàm hoặc thủ tục với một sô giá trị cụ thể ban đầu của tham số.
■ Ví dụ:
if n := 0 then GT := 1
- Phần hạ bậc: Trong đó tác động cần được thực hiện cho giá trị hiện thời của các tham số được định nghĩa bằng các tác động đã được định nghĩa trước đây.
■ Ví dụ:
GT := n*GT(n - 1)

4. ƯU ĐIỂM CỦA ĐỆ QUI
1. Đệ qui mạnh ở chỗ có thể định nghĩa một tập rất lớn các tác động chỉ bởi một số hữu hạn các mệnh đề.
2. Rất thích hợp để giải các bài toán có bản chất đệ qui.
3. Một chương trình viết theo giải thuật có tính đệ qui sẽ mang tính “Người” hơn, do đó sẽ:
- Sáng sủa.
- Dễ hiểu.
- Nêu bật được bản chất của vấn đề.
4. Có nhiều bài toán mà việc nghĩ ra lời giải đệ qui thường dễ hơn nhiều so với việc nghĩ ra lời giải dùng vòng lặp.
5. Khử đệ qui:
- Có một số giải thuật đệ qui thuộc loại tính toán đơn giản có thể được thay thế bởi một giải thuật khác không tự gọi chúng, sự thay thế đó được gọi là khử đệ qui.
- Tuy nhiên điều trên không có nghĩa là phải khử đệ qui bằng mọi giá và không nên e ngại cũng như có ác cảm với việc dùng đệ qui.
■ Ví dụ 1: Thủ tục đệ qui sau:
Function GT (n: word) : longint;
Begin
    if n := 0 then GT := 1 else
    GT := n * GT (n - 1);
end;
- Có thể được khử đệ qui như sau:
Function GT (n: word): longint;
Var
     i: word ;
     T: longint ;
Begin
     T := 1
     if n > 0 then
          For i := 1 to n do T: = t * i;
     GT:= T;
end;

Ví dụ 2: Thủ tục đệ qui
Function Fib (n: integer): integer;
Begin
     if n := 0 then Fib := 0 else
     if n:= 1 then Fib := 1
     else Fib := Fib(n - 1) + Fib(n - 2);
end;
- Có thể được khử đệ qui như sau:
Function Fib (n: integer): integer;
Var
     i, x, y: integer;
Begin
     if n := 0 then Fib := 0 else
     if n := 1 then Fib := else
     Begin
          i := 1; y := 0; x := 1;
          while i < 0 do
              Begin
                   i := i + 1
                   x := x + y
                   y := x - y
              end;
         Fib := x;
      end;
end;

5. ĐỆ QUI VÀ QUAY LUI
- Trong lập trình, phương pháp giải một bài toán tổng quát rất được chú ý. Đó là việc xác định các giải thuật để tìm lời giải cho một số bài toán nào đó không phải theo một luật tính toán cố định mà bằng phương pháp “thử và sai” (Try anf Error).
- Thông thường là ta phân tích quá trình thử và sai thành các công việc cục bộ dưới dạng một cây tìm kiếm và ta phải từng bước duyệt cây tìm kiếm đó một cách đệ qui theo cấp của cây.
- Trong nhiều bài toán, cây tìm kiếm này lớn lên rất nhanh theo hướng hàm mũ và công sức tìm kiếm cũng tăng theo với sự lớn lên của cây.
- Trong thực tế ta phải tỉa cây tìm kiếm bằng các cách Heuristic và như vậy ta đã làm giảm công sức tính toán tới một giới hạn có thể chấp nhận được.
- Nét đặc trưng của phương pháp này là ở chỗ các bước đi đến lời giải hoàn toàn bằng cách làm thử. Nếu có một lựa chọn được chấp nhận thì ghi nhớ các thông tin cần thiết và tiến hành các bước thử tiếp theo. Nếu trái lại không có một lựa chọn nào thích hợp cả thì làm lại bước trước, xóa bớt các ghi nhớ và quay về chu trình thử với các lựa chọn còn lại. Hành động này được gọi là quay lui (Back tracking) và các giải thuật thế hiện phương pháp này gọi là các giải thuật quay lui.
- Hơn nữa nếu ở mỗi bước số những nước có thể đi là m thì ta có thể dùng một tham số để chỉ độ sâu của sự đệ qui và như thê làm đơn giản đi điều kiện dùng theo sơ đồ sau:
Procedure Try (i: integer);
Var j: integer;
Begin
if i > m then XUẤT else
For j:= 1 to n do if
Nhận được then:
    Begin
        Ghi nhận nó.
        Try (i + 1);
        Xóa bỏ việc ghi nhận; (quay lui}
     end;
End;
- Thủ tục trên sẽ được khởi động bởi lệnh:
Try (1);
■ Ví dụ 1: (Bài toán 8 quân hậu)
Một bàn cờ quốc tế là một bảng hình vuông gồm có 8 hàng, 8 cột. Quân hậu là một quân cờ có thể ăn được bất kì quân nào nằm trên cùng một hàng, cùng một cột hay cùng một dường chéo. Bài toán đặt ra là: Hãy xếp 8 quân hậu trên bàn cờ sao cho không có quân hậu nào có thể ăn quân hậu nào. Điều đó cũng có nghĩa là trên mỗi hàng, mỗi cột, mỗi dường chéo chỉ có thể có một quân hậu.
Bài giải:
Program EIGHT_QƯEEN;
Var a: array [1..8] of integer;
       b: array [2.. 16] of integer;
       c: array [-7..7] of integer;
       x: array [1..8] of integer;
       i: integer;
procedure print;
var j: integer;
Begin
     For j:= 1 to 8 do write (x[k] : 4);
     Writein;
     Readln;
end;
procedure Try (i: integer);
var j: integer;
Begin
if i > 8 then prim else
For j := 1 to 8 do
      if (a[j] = 0) and (b[i + j] = 0) and (c[i – j] = 0) then
      Begin
           x[i] := j;
           a[j] := 1; b[i + j]:= 1; c[i - j]:= 1
           Try (+1);
           a[j]:= 0; b[i + j]:= 0; c[i - j]:= 0
      end;
end;
procedure Init;
var j: integer;
Begin
     Fillchar (a, sizeof(a), 0);
     Fillchar (b, sizeof(b), 0);
     Fillchar (c, sizeof(c), 0);
end;
Begin
     Init
     Try (1);
end.
■ Ví dụ 2: (Bài toán Mã đi tuần)
Chu một bàn cờ kích thước n x n. Một con mã di chuyển theo luật cờ vua được đặt trong một ô với tọa độ đầu là (Xo, Yo). Hãy lập trình tim một đường đi với n2 - 1 bước đi sao cho mọi ô trên bàn cờ đều được mã nhảy đến đúng một lần.
Bài giải:
Program Knighttour;
Const
      a: array [1..8] of integer = (2, 1, -1, -2, -2, -1, 1, 2);
      b: array [1..8] of integer = (1, 2, 2, 1, -1, -2,-2, -1);
      n = 5; nsq = 25;
Type
     index = 1..n;
Var
     q: Boolean;
     dd: Array [index, index] of integer;
     S: Set of index;
     x, y: integer;
Procedure Init;
Begin
     Fillchar (dd, size of (dd), 0);
     Writein ('Xin cho biết tọa độ ban đầu của ngựa');
     Readln (x, y);
     dd[x, y] := 1;
     q := False;
     S := [1, 2, 3, 4, 5];
end;
procedure print;
Var i, j: integer;
Begin
     q := True;
     For j:= 1 to n do
     Begin
              For j := 1 to n do write (dd[i, j] : 5);
              writeln;
     end;
end;
procedure Try (i)
Var
     j, u, v: integer;
     If i > nsq then
         print
         Else For j := 1 to 8 do
                 Begin
                      u := x + a[j];
                      v := y + b[j];
                      if (u in s) and (v in s) and (dd[u, v] = 0)
                      then
                            Begin
                                dd[u, v] := i;
                                x := u; y := v;
                                Try(i + 1);
                                x := u - a[j];
                                y := v – b[j];
                                dd[u, v] := 0
                           end;
                     end;
end;
Begin
     Init;
    Try (2);
     if q = False then writeln ('NO SOLUTION');
end;
Bản quyền bài viết thuộc về Sachgiai.com. Ghi nguồn Sách giải.com khi đăng lại bài viết này.

  Ý kiến bạn đọc

THÀNH VIÊN

Hãy đăng nhập thành viên để trải nghiệm đầy đủ các tiện ích trên site
Kênh Bóng đá trực tiếp hôm nay miễn phí
Kênh
90Phut TV full HD ⇔ 888new
69VN ⇔ HM88 ⇔ F168 ⇔ 123b ⇔ 566

Vmax ⇔ 78Win ⇔ https://xn88.bio/
GK88 ⇔ SHBET ⇔ 78win ⇔ u888 ⇔ 66b
fo88vic88 ⇔ u888 ⇔ 888p ⇔ 69vn
BL555 ⇔ 99OK ⇔ f168 ⇔ Link MB66
mv66af88 ⇔ 8x bet ⇔ 88AA
789BET ⇔ LC88 ⇔ BL555 ⇔ 789f
999slot ⇔ 789F ⇔ MB66 ⇔ 8xbet
https://789betcom0.com/ ⇔ https://hi88.baby/
789BET ⇔ au88 ⇔  ⇔ https://xx88.ink/
zo88 ⇔ ev99 ⇔ 888b ⇔ go88 ⇔ kèo nhà cái
cm88 ⇔ 88aa ⇔ Kkwin ⇔ tv88 ⇔ 89bet
mb66.racing ⇔ 88go ⇔ FO88 ⇔ 88xx
188v ⇔ f168 ⇔ QQ88 ⇔ bk8 ⇔ bk8
99ok ⇔ f168 ⇔ iwinclub ⇔ vn88 ⇔ 69vn
m88 ⇔ 56win ⇔ P3 ⇔ 8s ⇔ RWIN
vn23 ⇔ SHBET ⇔ kubet ⇔ 888new
BL555 ⇔ hi88 ⇔ https://fun88.social/
thabet ⇔ SV88 ⇔ https://vnalo789c.com/
https://qq88.fun/ ⇔  ⇔ 888New ⇔ QQ88
daga ⇔ SHBET ⇔ keo nha cai ⇔ bl-555.site
https://bshbet.com/ ⇔ https://uk88.rocks
kkwin ⇔ KUWIN ⇔ 8xbet ⇔ RR88 ⇔ 188v
mb6678win ⇔ https://hello8880.net/
tv88UU88 ⇔ HM88 ⇔ mb 66 ⇔ TV88
NOHU ⇔ 77ball ⇔ 32win ⇔ Kuwin
ek333 ⇔ xoso66 ⇔ nổ hũ ⇔ SUN WIN
X88 ⇔ 78win ⇔ Jun88 ⇔ uu88 ⇔ 6FF
88i ⇔ KINGFUN ⇔ https://789club24.com/
https://98winlive.com/ ⇔ 
https://bet88yk.com/ ⇔ https://alo789apk.app/
https://33win100.com/ ⇔ https://u888ny.com/
alo789 ⇔ OK8386 ⇔ x88 ⇔ SHBET
https://hi88.voyage/ ⇔ https://79kings.blue/
https://dom88.jp.net/ ⇔ https://hello880.net/
https://789club60.com/ ⇔ https://blc88.net/
23win ⇔ 6ff ⇔ uu88 ⇔ xoso66 ⇔ bomwin
nhatvip ⇔ https://789club24.com/ ⇔ 789 bet
dola789 ⇔ 8xbet ⇔ 78win ⇔ QQ88
XX88 ⇔ ev99 ⇔ 69vn ⇔ rr88 ⇔ rr88
Uu88 ⇔ win456 ⇔ Tài xỉu online ⇔ XN88
https://33win101.com/ ⇔ oxbet ⇔ Slot365
78wind.com ⇔ bet88 ⇔ XX88
VN88 ⇔ 789BET ⇔ OKFUN ⇔ ee88 ⇔ 12bet
hitclub ⇔ Kkwin ⇔ VankhanhTV ⇔ 
3WIN ⇔ WIN678 ⇔ KUWIN ⇔ 58WIN
68 game bàiEE88 ⇔ https://taixiu88.pro/
888new.lol ⇔ ok9 football ⇔ K8CC
https://hi88o.com/ ⇔ https://hi88.gives/
https://qq88.co.com/ ⇔ 
8xbet ⇔ https://shbetk.net/ ⇔ RIKVIP ⇔ rikvip
https://mm88.us.com/ ⇔ 79king
ww88 ⇔ https://78win.bot/ ⇔ https://13win.vegas/
https://lc88o.com/ ⇔ https://hi88.uno/
https://58win1.info/ ⇔ j88 ⇔ j88 ⇔ 69vn
Slot365 ⇔ alo88 ⇔ UU88 ⇔ 32 win
888TO ⇔ wstar77 ⇔ 73bet ⇔ 888b
11uu ⇔ 123B ⇔ 78win ⇔ Slot365
789f ⇔ mv88 ⇔ 789f ⇔ Bsport
888New ⇔ EV99 ⇔ u88 ⇔ sunwin
tỷ lệ kèo nhà cái hôm nay ⇔ BIN88
https://f8bet0.world ⇔ https://qq88.studio/
https://nh8811.com/ ⇔ Leo88 ⇔ 78win
 ⇔ 3win ⇔ https://cakhiatv88.net/
7m ⇔ i9 Bet ⇔ Tv88 ⇔ hi88 ⇔ 888To
789pu.comhi88 ⇔ au88 ⇔ VN168
Bong88 ⇔ socolive ⇔ bet88 ⇔ 555WIN
https://au88.black/ ⇔ trực tiếp bóng đá
https://king88clb.com/ ⇔ https://f168hi.com/
sv66ax88 ⇔ 88clb ⇔ Nn88
https://32win.vc/ ⇔ 888new ⇔ PG88 ⇔ PG88
EE88 ⇔ SanClub ⇔ F168 ⇔ QQ88
hb88 ⇔ Vin777 ⇔ SV388 ⇔ MV66 ⇔ 23WIN
https://vankhanhtvv.com/ ⇔ Nhà Cái LC88
https://789fnew.com/ ⇔ https://u888lm.com/
https://sv66.coupons/ ⇔ https://f168.tech/
https://8kbetbh.com/ ⇔ https://ta88club.kim/
socolivemv88 ⇔ https://rr88.com.se/
https://bet168.com.co/ ⇔ https://8kbet.co/
https://888b-link.cc/ ⇔ https://sunwinn.deal/
88gokingfun ⇔ https://bong88vn.wiki/
SHBET ⇔ https://shbet.racing/
RR99 ⇔ U888 ⇔ OK8386 ⇔ Mv88
MM88 ⇔ 33win ⇔ BL555 ⇔ 69vn
hi88com ⇔ https://w88link1.com/
xocdia88 ⇔ 77ball ⇔ vuabet88 ⇔ betvisa
https://fun88link0.com/ ⇔ https://fun88link1.com/
https://188betlink0.com/ ⇔ https://188betlink1.com/
https://188betlink2.com/ ⇔ https://w88link0.com/
thabet ⇔ 888P ⇔ 11UU ⇔ EV88 ⇔ 789F
69vn77win ⇔ xx88 ⇔ 78win
https://okfun.bz/ ⇔ https://daga88.beer/
QQ88 ⇔ https://i9betz4.com/ ⇔ Kuwin
w88link2.com ⇔ w88link3.com ⇔ 32WIN
https://8dayvip.mobi/ ⇔ https://8dayvip.com/
86bet ⇔ t88 ⇔ af88 ⇔ U888 ⇔ 86bet
https://pg99yk.com/ ⇔ https://u888wl.com/
89bet ⇔ 888new ⇔ 88AA ⇔ GK88
78win01 ⇔ GO99 ⇔ BET88 ⇔ 99win ⇔ 
https://8kbettt.com/ ⇔ https://86bet.tech/
https://789betca.com/ ⇔ https://fly88.gifts/
lc88 ⇔ VN88 ⇔ 69vn ⇔ nh88 ⇔ vn88
 ⇔ 88vv ⇔ sv388 ⇔ KWIN
tỷ lệ kèo nhà cái 88 ⇔ PG66 ⇔ 68win
BL555 ⇔  ⇔ SV388 ⇔ SHBET ⇔ hitclub
MAX79 ⇔ UU88 ⇔ HM88
https://bet88.ventures/ ⇔ bongdalu22.com
zx88 ⇔ ev99 ⇔ 8s ⇔ bet8s ⇔ QQ88
https://f168.name/ ⇔ https://13wincom.io/
Nhà cái vn88 ⇔ Nhà Cái QQ88
https://fb888.in.net/ ⇔ https://kjc.ac/
https://onbet.in.net/ ⇔ link vn88 ⇔ HZ88
http://58win.trading/ ⇔ https://qq88.gives/
bong88 ⇔ sky88 ⇔ Cổng game rikvip ⇔ ev99
79KING ⇔ Bet88 ⇔ XN88 ⇔ i9bet ⇔ VN23
https://kkwin.fan/ ⇔ https://555win.bike/
https://f8bet.courses/ ⇔ https://go8play.com/
https://lc88.bar/ ⇔ 789f ⇔ abc8 ⇔ good88
789win ⇔ Hitclub ⇔ https://f8bet80.one/
lương sơn tv ⇔ vwin ⇔ sut88 ⇔ vua88
hb88 ⇔ https://okfun.center/ ⇔ 68win
LC88 ⇔ 79king ⇔ https://hi88.tours/
https://ok9.charity/ ⇔ https://kkwin68.info/
https://ee88com.me/ ⇔ https://new88blog.org
nổ hũ ⇔ https://uu88vn.com ⇔ nhà cái LC88
nohu ⇔ lc88 com ⇔ 69VN ⇔ Ok365 ⇔ 6FF
Nohu90 ⇔ go8 ⇔ 22vip ⇔ af88 ⇔ 86bet
five88 ⇔ 68win ⇔ 11uu ⇔ https://go8.beer/
đánh bài tiến lên ⇔ sin88 ⇔ 9win ⇔ 88i
https://u888.ac/ ⇔ https://king88com.uk.net/
https://shbet.gg/ ⇔ LC88 ⇔ OKKING
13win ⇔ https://88fc0.com/ ⇔ abc8 ⇔ U888
https://s666.garden ⇔ https://fly88.select/
https://bk8co.net/ ⇔ bet88 ⇔ F168
https://qq8876.net/ ⇔ hi88s com ⇔ f168
https://88xx.mobi/ ⇔ bet88 ⇔ 88clb
GO8 ⇔ https://qq88.social/ ⇔ LC88
https://j88vm.com/ ⇔ https://78winvina.com/
https://luongson161.tv/ ⇔ https://savinovineyards.com/
https://okfun.cfd/ ⇔ https://keonhacai.deals/
https://j88com.today/ ⇔ 28bet ⇔ MB66
https://mk8th.net/ ⇔ https://58win.faith/
Jun88 ⇔ 188v ⇔
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây