Chương II: Các thuật toán đệ quy và thuật toán quay lui <ul><li>Thuật toán đệ quy </li></ul><ul><li>Một số bài toán sử dụn...
2. Một số bài toán sử dụng thuật toán quay lui <ul><li>Có dạng: </li></ul><ul><li>Hãy xác định các bộ gồm n thành phần:  <...
Một phương pháp giải quyết <ul><li>Khi cần xác định x i , ta giả sử đã xác định được i-1 thành phần: x 1 , x 2 ,..., x i-1...
Minh hoạ   <ul><li>Procedure Try(i); {Thử xem x i  sẽ nhận giá trị nào} </li></ul><ul><li>Begin  </li></ul><ul><li>For <mỗ...
Ví dụ: Liệt kê các số nhị phân gồm n chữ số <ul><li>procedure try(i: byte); </li></ul><ul><li>var j: byte; </li></ul><ul><...
Trong đó: <ul><li>1. Khai báo: </li></ul><ul><li>type day=array[1..10] of 0..1; </li></ul><ul><li>var x:day; </li></ul><ul...
<ul><li>3. Chương trình chính: </li></ul><ul><li>begin </li></ul><ul><li>readln(n); </li></ul><ul><li>try(1); </li></ul><u...
Ví dụ: Liệt kê các hoán vị của n <ul><li>procedure try(i:byte); </li></ul><ul><li>var j:byte; </li></ul><ul><li>begin </li...
Trong đó: <ul><li>1. Khai báo: </li></ul><ul><li>type day=array[1..10] of 1..10; </li></ul><ul><li>var x:day; </li></ul><u...
Ví dụ: Liệt kê các tổ hợp chập k của n phần tử (1..n) <ul><li>procedure try(i:byte); </li></ul><ul><li>var j:byte; </li></...
Chương trình chính <ul><li>begin </li></ul><ul><li>write('So to hop chap k=');readln(k); </li></ul><ul><li>write('  cua n=...
Upcoming SlideShare
Loading in …5
×

Section 2 Quay Lui

1,525 views

Published on

Published in: Education, Sports
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,525
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
162
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Section 2 Quay Lui

  1. 1. Chương II: Các thuật toán đệ quy và thuật toán quay lui <ul><li>Thuật toán đệ quy </li></ul><ul><li>Một số bài toán sử dụng thuật toán quay lui </li></ul>
  2. 2. 2. Một số bài toán sử dụng thuật toán quay lui <ul><li>Có dạng: </li></ul><ul><li>Hãy xác định các bộ gồm n thành phần: </li></ul><ul><li>(x 1 , x 2 , ..., x n ) thoã mãn điều kiện B nào đó. Với x i được chọn từ tập S i cho trước gồm n i phần tử (i=1..n). </li></ul><ul><li>Ví dụ: Xác định tất cả các bộ gồm n thành phần (x[1], x[2], ..., x[n]), trong đó: x[i] là các số nguyên nhận giá trị từ 1 đến m (i=1..n). </li></ul>
  3. 3. Một phương pháp giải quyết <ul><li>Khi cần xác định x i , ta giả sử đã xác định được i-1 thành phần: x 1 , x 2 ,..., x i-1 . Để xác định thành phần x i , ta duyệt tất cả các khả năng có thể có của nó. </li></ul><ul><li>Với mỗi khả năng j ta luôn kiểm tra xem j có được chấp nhận không? </li></ul><ul><li>Nếu chấp nhận j, thì xác định x i theo khả năng j. </li></ul><ul><li>Tiếp đến kiểm tra, nếu i < n thì ta tiến hành xác định x i+1 , ngược lại (i=n) thì ta được một lời giải. </li></ul><ul><li>Rồi kiểm tra khả năng j tiếp theo của x i . </li></ul><ul><li>Nếu tất cả các khả năng của j không có khả năng nào được chấp nhận thì quay lại bước trước để xác định lại x i-1 . (Cơ chế đệ quy giúp có thể thực hiện được điều này) </li></ul>
  4. 4. Minh hoạ <ul><li>Procedure Try(i); {Thử xem x i sẽ nhận giá trị nào} </li></ul><ul><li>Begin </li></ul><ul><li>For <mỗi khả năng j của x i > do </li></ul><ul><li>Begin If <chấp nhận> then </li></ul><ul><li>Begin <Xác định x i theo j>; </li></ul><ul><li>if i=n then <Ghi nhận một lời giải> </li></ul><ul><li>else Try (i+1); </li></ul><ul><li>[<Huỷ việc xác định x i theo j>;] </li></ul><ul><li>End; </li></ul><ul><li>End; </li></ul><ul><li>End; </li></ul><ul><li>BEGIN [Init; {Khởi tạo}] </li></ul><ul><li>Try(1); </li></ul><ul><li>END. </li></ul>
  5. 5. Ví dụ: Liệt kê các số nhị phân gồm n chữ số <ul><li>procedure try(i: byte); </li></ul><ul><li>var j: byte; </li></ul><ul><li>begin </li></ul><ul><li>for j:=0 to 1 do </li></ul><ul><li>begin </li></ul><ul><li>x[i]:=j; </li></ul><ul><li>if i=n then print(x) else try(i+1); </li></ul><ul><li>end; </li></ul><ul><li>end; </li></ul>
  6. 6. Trong đó: <ul><li>1. Khai báo: </li></ul><ul><li>type day=array[1..10] of 0..1; </li></ul><ul><li>var x:day; </li></ul><ul><li>n:byte; </li></ul><ul><li>2. procedure print(x:day); </li></ul><ul><li>var k:byte; </li></ul><ul><li>begin </li></ul><ul><li>for k:=1 to n do write(x[k]); </li></ul><ul><li>writeln; </li></ul><ul><li>end; </li></ul>
  7. 7. <ul><li>3. Chương trình chính: </li></ul><ul><li>begin </li></ul><ul><li>readln(n); </li></ul><ul><li>try(1); </li></ul><ul><li>end. </li></ul>
  8. 8. Ví dụ: Liệt kê các hoán vị của n <ul><li>procedure try(i:byte); </li></ul><ul><li>var j:byte; </li></ul><ul><li>begin </li></ul><ul><li>for j:=1 to n do </li></ul><ul><li>begin </li></ul><ul><li>if b[j] then </li></ul><ul><li>begin </li></ul><ul><li>x[i]:=j; </li></ul><ul><li>b[j]:=false; </li></ul><ul><li>if i=n then print(x) else try(i+1); </li></ul><ul><li>b[j]:=true; </li></ul><ul><li>end; </li></ul><ul><li>end; </li></ul><ul><li>end; </li></ul>
  9. 9. Trong đó: <ul><li>1. Khai báo: </li></ul><ul><li>type day=array[1..10] of 1..10; </li></ul><ul><li>var x:day; </li></ul><ul><li>n,i:byte; </li></ul><ul><li>b:array[1..10] of boolean; </li></ul><ul><li>2. Chương trình chính: </li></ul><ul><li>begin </li></ul><ul><li>readln(n); </li></ul><ul><li>for i:=1 to n do b[i]:=true; </li></ul><ul><li>try(1); </li></ul><ul><li>end. </li></ul>
  10. 10. Ví dụ: Liệt kê các tổ hợp chập k của n phần tử (1..n) <ul><li>procedure try(i:byte); </li></ul><ul><li>var j:byte; </li></ul><ul><li>begin </li></ul><ul><li>for j:=1 to n do </li></ul><ul><li>begin </li></ul><ul><li>if b[j] and (j>x[i-1]) then </li></ul><ul><li>begin </li></ul><ul><li>x[i]:=j; </li></ul><ul><li>b[j]:=false; </li></ul><ul><li>if i=k then print(x) else try(i+1); </li></ul><ul><li>b[j]:=true; </li></ul><ul><li>end; </li></ul><ul><li>end; </li></ul><ul><li>end; </li></ul>
  11. 11. Chương trình chính <ul><li>begin </li></ul><ul><li>write('So to hop chap k=');readln(k); </li></ul><ul><li>write(' cua n=');readln(n); </li></ul><ul><li>x[0]:=0; </li></ul><ul><li>for i:=1 to n do b[i]:=true; </li></ul><ul><li>try(1); </li></ul><ul><li>end. </li></ul>

×