Đệ quy và quay lui
Upcoming SlideShare
Loading in...5
×
 

Đệ quy và quay lui

on

  • 23,533 views

 

Statistics

Views

Total Views
23,533
Views on SlideShare
23,283
Embed Views
250

Actions

Likes
3
Downloads
588
Comments
7

6 Embeds 250

http://www.slideshare.net 179
http://ndktest.blogspot.com 28
http://ndkeis.blogspot.com 23
http://www.ndkeis.tk 12
http://ndksblog.blogspot.com 7
http://ndkeis.blogspot.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Thanks.
    Are you sure you want to
    Your message goes here
    Processing…
  • tai the nao?
    Are you sure you want to
    Your message goes here
    Processing…
  • Em van chua down duoc. Why?
    Are you sure you want to
    Your message goes here
    Processing…
  • Tôi không download được
    Are you sure you want to
    Your message goes here
    Processing…
  • thanks!
    -----------------------------
    http://svsupham.com
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Đệ quy và quay lui Đệ quy và quay lui Presentation Transcript

  • Chương II: Các thuật toán đệ quy và thuật toán quay lui
    • Thuật toán đệ quy
    • Một số bài toán sử dụng thuật toán quay lui
    • * Làm bài tập theo nhóm
  • 1. Thuật toán đệ quy (Recursion)
    • Đại cương
    • Phương pháp thiết kế một thuật toán đệ quy
    • Xây dựng một thuật toán đệ quy trên một danh sách liên kết đơn
    • Xây dựng một thuật toán đệ quy trên một cây nhị phân (lưu trữ móc nối)
  • Đại cương
    • Chương trình đệ quy là chương trình gọi đến chính nó.
    • Một chương trình đệ quy thì không thể gọi đến chính nó mãi mãi mà phải có điểm dừng (trường hợp suy biến).
  • Phương pháp để thiết kế một thuật toán đệ quy
    • Tham số hoá bài toán
    • Phân tích trường hợp chung (biểu diễn bài toán dưới dạng bài toán cùng loại nhưng khác phạm vi giải quyết)
    • Xác định trường hợp suy biến
  • Ví dụ: Sắp xếp mảng a gồm n phần tử
    • Tham số hoá bài toán:
    • procedure Sort(dau, cuoi: word);
    • Phân tích trường hợp chung:
    • Thủ tục Sort(dau, cuoi) có biểu diễn bởi các lệnh:
      • Sort(dau+1, cuoi);
      • if a[dau]>a[dau+1] then
      • begin swap(a[dau],a[dau+1]);
      • Sort(dau+1, cuoi);
      • end;
    • Xác định trường hợp suy biến: dau = cuoi (không làm gì)
  • procedure Sort(dau, cuoi: word);
    • Begin
    • If dau<>cuoi then
      • begin Sort(dau+1, cuoi);
        • if a[dau]>a[dau+1] then
        • begin swap(a[dau],a[dau+1]);
        • Sort(dau+1, cuoi);
        • end;
      • end;
    • End;
    • Lời gọi từ chương trình chính: Sort(1,n);
    • Độ phức tạp tính toán: O(n 2 )
  • Ví dụ: Tính a n
    • Tham số hoá bài toán:
    • Function Power(a: real; n: byte):real;
    • Phân tích trường hợp chung:
    • a n = a.a n-1 hay Power(a,n) = a* Power(a,n-1)
    • Tr.hợp suy biến: n = 1 ( Power(a,1) = a )
    • Độ phức tạp tính toán: O(n)
  • Ví dụ: Tính a n (một cách tính khác)
    • Phân tích trường hợp chung:
    • Nếu n chẵn: Power(a,n) = sqr(Power(a,n div 2))
    • Nếu n lẻ: Power(a,n) = a*sqr(Power(a,n-1 div 2))
    • Trường hợp suy biến: n = 1 ( Power(a,1) = a )
    • Độ phức tạp tính toán: O(log 2 n)
  • Xây dựng một thuật toán đệ quy trên một danh sách liên kết đơn
    • Xét khai báo cho trước như sau:
    • Type TroNut = ^Nut;
    • Nut = Record
    • Info: Integer;
    • Next: TroNut;
    • End;
    • Var F: TroNut; {danh sách F}
  • Viết chương trình con (hàm/thủ tục): CTC([var] F: TroNut; ...)
    • Xem thử có thể biểu diễn: CTC(F, ...) bởi CTC(F^.next, ...)
    • Ví dụ: Liệt kê giá trị trường Info của mọi nút thuộc danh sách F
    • Procedure List(F: TroNut);
    • Begin If F<>nil then
    • begin writeln(F^.Info);
    • List(F^.Next);
    • end;
    • End;
  • Sắp xếp một danh sách F
    • Procedure Sort(F: TroNut);
    • Begin
    • If (F<>nil) and (F^.Next<>nil) then
    • begin Sort(F^.Next);
    • If F^.Info>F^.Next^.Info then
    • begin swap(F^.Info, F^.Next^.Info);
    • Sort(F^.Next);
    • end;
    • end;
    • End;
  • Hàm Function LaTangDan(F: TroNut): Boolean kiểm tra tính tăng dần của danh sách F
    • Function LaTangDan(F: TroNut) : Boolean;
    • Begin
    • If (F = nil) or (F^.Next = nil) then LaTangDan := True
    • else LaTangDan := (F^.Info< F^.Next^.Info)
    • and LaTangDan(F^.Next);
    • End;
  • Thủ tục bổ sung một nút có giá trị trường Info bằng X vào danh sách tăng dần F
    • Procedure BS (var F: TroNut; X:Integer);
    • var q: TroNut;
    • Begin If (F=nil) or (F^.Info > X) then
    • begin new(q); q^.info:=X; q^.next:= F;
    • F:=q;
    • end
    • Else BS(F^.Next, X);
    • End;
  • Thủ tục xoá một nút có giá trị trường Info bằng X của danh sách tăng dần F
    • Procedure Xoa (var F: TroNut; X:Integer);
    • var q: TroNut;
    • Begin If F<>nil then
    • If F^.Info=X then
    • begin q:=F;
    • F:= F^.Next;
    • Dispose(q);
    • end
    • Else
    • If F^.Info < X then Xoa(F^.Next, X);
    • End;
  • Xây dựng một thuật toán đệ quy trên một cây nhị phân lưu trữ móc nối
    • Xét khai báo cho trước như sau:
    • Type TroNut = ^Nut;
    • Nut = Record
    • Info: Integer;
    • Left, Right: TroNut;
    • End;
    • Var T: TroNut; {cây T}
  • Viết chương trình con (hàm/thủ tục): CTC([var] T: TroNut; ...)
    • Xem thử có thể biểu diễn: CTC(T, ...) bởi CTC(T^.left, ...) và CTC(T^.right, ...)
    • Ví dụ: Thủ tục xoá cây T
    • Procedure Xoa(T: TroNut);
    • Begin If T<> nil then
    • begin Xoa(T^.Left);
    • Xoa(T^.Right);
    • Dispose(T);
    • end;
    • End;
  • Ví dụ: Tìm chiều cao của cây T
    • Function ChieuCao(T: Tronut) : Word;
    • Begin
    • If T = nil
    • then ChieuCao := 0
    • else ChieuCao :=max( ChieuCao(T^.left) , ChieuCao(T^.left) )+1;
    • End;
  • Ví dụ: Tìm địa chỉ nút cha của nút trỏ bởi p (thuộc cây T)
    • Function Cha(T, p: TroNut) :TroNut;
    • Begin
    • If (T=nil) or (T=p)
    • then Cha :=nil
    • else
    • If (T^.Left=p) or (T^.Right=p)
    • then Cha :=T
    • else
    • if Cha(T^.Left, p) <>nil
    • then Cha := Cha(T^.Left, p)
    • else Cha := Cha(T^.Right, p) ;
    • End;
  • Ví dụ: Kiểm tra cây T là một đống
    • Function LaDong(T: TroNut) : Boolean;
    • { cho kết quả là True nếu cây T là một đống}
    • Begin
    • If (T = nil) or (T^.Left=nil and T^.Right=nil)
    • then LaDong := True
    • else If T^.Left=nil and T^.Right<>nil
    • then LaDong :=(T^.Info> T^.Right^.Info) and LaDong(T^.Right)
    • else If T^.Left<>nil and T^.Right=nil
    • then LaDong := (T^.Info> T^.Left^.Info)
    • and LaDong(T^.Left)
    • else LaDong := (T^.Info> T^.Left^.Info)
    • and (T^.Info> T^.Right^.Info)
    • and LaDong(T^.Left)
    • and LaDong(T^.Right) ;
    • End;