Tải bản đầy đủ (.pdf) (135 trang)

Tập Bài Giảng Môn Học Toán Rời Rạc.pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (7.54 MB, 135 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

TRƯỜNG ĐẠI HỌC DUY TÂN KHOA CƠNG NGHỆ THƠNG TIN

Khoa: Cơng Nghệ Thơng Tin Bậc đào tạo: Đại học – Cao đẳng

Đà Nẵng, tháng 01 năm 2022

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>1.Thông tin về giảng viên: </b>

− Họ và tên: Lưu Văn Hiền − Chức danh, học hàm, học vị: Thạc sĩ

− Thời gian, đ điểm làm việc:ịa Khoa CNTT - Trường ĐH Duy Tân − Điện thoại: 01229500029

− Email:

<b>2. Các mơn học tiên quyết </b>

Lập trình cơ sở, Tốn cao cấp A1

<b>3. Các môn học kế tiếp </b>

Cơ sở dữ liệu, Cấu trúc dữ liệu, mạng máy tính

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>LỜI NĨI ĐẦU</b>

Tốn rời rạc là một nhánh quan trọng của toán học nghiên cứu các đối tượng rời rạc và được xem là cơ sở tốn học của ngành khoa học máy tính. Tốn rời rạc không chỉ cung cấp cho sinh viên những kiến thức cơ bản để có thể ứng dụng nó trong việc giải quyết các bài toán về các cấu trúc rời rạc bắt nguồn từ tập hợp các đối tượng, ví dụ như tổ hợp, quan hệ, đồ thị…Mà cịn giúp sinh viên có điều kiện hiểu rõ hơn bản chất của việc lưu trữ và xử lý thơng tin trong máy tính cũng là một quá trình rời rạc.

Bài giảng này được phân bổ thành chương với các nội dung chính như sau:5 Chương 1: <b>Các kiến thức cơ sở: Logic, tập hợp </b>trình bày những kiến thức về logic mệnh đề, quy nạp toán học và đệ quy trong chương trình. Ngồi ra, trong chương này cũng nhắc lại các kiến thức về tập hợp và các phép toán trên tập hợp

Chương 2: <b>Thuật toán, số nguyên và ma trận </b>trình bày những kiến thức về thuật toán, độ phức tạp của thuật toán, số nguyên và thuật tốn cho các phép tính số ngun, ma trận và các thuận toán nhân ma trận, chuyển vị và lũy thừa các ma trận.

Chương 3: <b>Bài toán đếm và xác suất rời rạc </b>trình bày những kiến thức về phương pháp đếm, giải tích tổ hợp, xác suất rời rạc, bài tốn tồn tại, các thuật toán giải quyết bài toán liệt kê.

Chương 4: <b>Lý thuyết đồ thị. </b>Trình bày những kiến thức cơ sở về đồ thị như các khái niệm, đường đi trên đồ thị và các ứng dụng của đồ thị trong thực tế.

Chương 5: <b>Đại số Boole. </b>Trình bày những kiến thức về Đại số Boole và các phương pháp cực tiểu hóa mạch hữu hiệu.

Bài giảng được biên soạn với mong muốn chuyển tải những kiến thức cơ bản nhất, trọng tâm nhất của bộ mơn Tốn rời rạc đến với các bạn sinh viên quan tâm. Rất mong được nhận được các ý kiến đóng góp xây dựng để bài giảng được hoàn thiện hơn ở những lần cải biên sau.

Lưu Văn Hiền

Đà Nẵng, 2022

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<small>GV: LƯU VĂN HIỀNTRANG 4 </small>

5. Bài toán tồn tại ... 69

6. Bài toán liệt kê ... 71

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<small>GV: LƯU VĂN HIỀNTRANG 5 </small>

7. Đồ thị đẳng cấu ... 97

8. Đồ thị Euler ... 101

9. Đồ thị Hamilton ... 105

10. Tìm đường đi ngắn nhất (Dijkstra) ... 108

11. Tìm cây khung nhỏ nhất (Prim) ... 110

Chương 5 THIẾT KẾ MẠCH TỔ HỢP ... 117

1. Đại số Boole ... 118

2. Biểu diễn hàm Boole ... 119

3. Mạch tổ hợp ... 128

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<small>GV: LƯU VĂN HIỀNTRANG 6 </small>

Sau khi học xong chương này sinh viên có thể vận dụng các luật đại số mệnh đề để chứng minh và rút gọn một biểu thức mệnh đề. Bên cạnh đó, sinh viên biết cách áp dụng các cấu trúc rời rạc trong lưu trữ, truyền thông và thao tác dữ liệu.

B. NỘI DUNG CHƯƠNG HỌC

1. Logic m<b>ệnh đề</b>

Logic là gì? Là một nhánh của triết học và toán học, nghiên cứu về nguyên tắc, phương pháp và tiêu chuẩn hình thức cho sự hợp lệ của suy luận và kiến thức.

<b>Ứng dụng của logic: </b>

o Trong các suy luận tốn học.

o Trong khoa học máy tính: thiết kế vi mạch, xây dựng chương trình, kiểm chứng chương trình, trí tuệ nhân tạo.

<b>Mệnh đề: là một phát biểu, một câu trần thuật, chỉ nhận 1 trong 2 giá trị hoặc đúng </b>

hoặc sai.

Một số ví dụ về mệnh đề: o Ví dụ sau là mệnh đề.

▪ 2 + 3 = 6 (nhận giá trị sai)

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<small>GV: LƯU VĂN HIỀNTRANG 7 </small> ▪ Thành phố Đà Nẵng giáp với tỉnh Quảng Nam (nhận giá trị đúng)

o Ví dụ sau khơng là mệnh đề. ▪ Hơm nay là thứ mấy? ▪ Ơi đẹp quá!

▪ X + 3 = 4 (x không rõ giá trị)

Việc xác định đúng sai của một mệnh đề không phải là nhiệm vụ của logic. Câu có chứa thời gian chỉ là mệnh đề khi và chỉ khi thời gian đã được xác định.

<b>Một số quy ước: </b>

o p, q, r … dùng để ký hiệu một mệnh đề hoặc một biến mệnh đề. o Giá trị chân lý đúng của 1 mệnh đề là True (1), sai là False (0)

o Bảng chân trị: dùng để biểu diễn mối quan hệ giữa các giá trị chân lý giữa các mệnh đề.

2. Các phép toán logic 2.1.<b> Phép phủ định</b>

Cho mệnh đề p, phép phủ định của mệnh đề p ký hiệu là p (đọc là phủ của p hoặc không p). Chân trị của mệnh đề p được xác định theo bảng chân trị sau:

<b>Ví dụ: </b>

o p: 4 là số nguyên tố. Đây là một mệnh đề có giá trị sai

o p: 4 không phải là số nguyên tố. Đây là một mệnh đề có giá trị đúng. 2.2.<b> Phép hộ</b>i

Cho 2 mệnh đề p, q, phép hội của 2 mệnh đề p, q được ký hiệu là p  q (đọc là p hội q hoặc p và q). Chân trị của p  q là 1 khi và chỉ khi cả p và q đều có chân trị 1, trong các trường hợp khác p  q có chân trị 0. Phép hội giữa p và q được xác định bởi bảng chân trị sau:

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<small>GV: LƯU VĂN HIỀNTRANG 8 </small>

o p  q có chân trị là 0 (vì p có chân trị 1, q có chân trị 0) o p  r có chân trị là 1 (vì p có chân trị 1, r có chân trị 1) 2.3.<b> Phép tuyể</b>n

Cho 2 mệnh đề p, q, phép tuyển của 2 mệnh đề p và q, ký hiệu là p  q (đọc là p tuyển q hoặc p hay q). Chân trị của p  q là 0 khi và chỉ khi cả p và q đều nhận chân trị là 0, các trường hợp còn lại đều nhận chân trị 1. Phép tuyển giữa p  q được xác định bởi

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<small>GV: LƯU VĂN HIỀNTRANG 9 </small> o p  q có chân trị là 1 (vì p có chân trị 1, q có chân trị 0)

o q  r có chân trị là 0 (vì q và r đều có chân trị là 0) 2.4.<b> Phép tuyển loạ</b>i

Giả sử p và q là hai mệnh đề thì mệnh đề “hoặc p hoặc q” được gọi là tuyển loại của 2 mệnh đề đó. Ký hiệu p q. Ta có bảng chân trị như sau:

Xét ví dụ mệnh đề sau: “Hoặc là điểm của tôi được hơn 4.0 hoặc tôi sẽ bị học lại mơn này”. Trong đó:

P: Điểm của tôi được hơn 4.0. Q: Tôi bị học lại mơn này.

Khi đó mệnh đề như trên chính là : p  q. Phép kéo theo

Cho 2 mệnh đề p, q, mệnh đề “nếu p thì q” được ký hiệu là p → q (đọc là p kéo theo q). Để xác định chân trị cho mệnh đề p → q ta xem bảng chân trị sau:

Xét ví dụ mệnh đề sau: “Nếu tơi có 1 tỷ đồng thì tơi mua xe hơi” Ta có các trường hợp như sau:

o Tơi có 1 tỷ đồng, và tơi mua xe hơi: mệnh đề hiển nhiên là đúng. o Tôi khơng có 1 tỷ đồng, tơi khơng mua xe hơi: mệnh đề vẫn đúng. o Tơi khơng có 1 tỷ đồng, nhưng tôi vẫn mua xe hơi: mệnh đề vẫn đúng.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<small>GV: LƯU VĂN HIỀNTRANG 10</small> o Tơi có 1 tỷ đồng, nhưng tôi không mua xe hơi: mệnh đề sai.

* Mệnh đề kéo theo chỉ sai khi “mệnh đề nếu” có chân trị 1 nhưng “mệnh đề thì” có

Cho 2 mệnh đề p, q mệnh đề “nếu p thì q và ngược lại” được ký hiệu là p ↔ q (đọc là p khi và chỉ khi q, p nếu và chỉ nếu q, p là điều kiện cần và đủ để có q). Cả hai chiều p → q và q → p đều đúng nên nếu p đúng thì q cũng đúng và ngược lại. Ta có bảng chân trị

<b>Các mệnh đề phức hợp được tạo ra từ các mệnh đề sơ cấp bằng các phép toán </b>

logic, việc xác định chân trị của các mệnh đề này dựa trên chân trị của mệnh đề sơ cấp cũng nhờ vào các phép toán logic. Chúng ta quan tâm đến việc xác định chân trị cho mệnh đề phức hợp hơn là các mệnh đề sơ cấp.

Biểu thức logic chính là các mệnh đề phức hợp có giá trị là True (1) hoặc False (0). Trong đại số ta có các biểu thức đại số được xây dựng từ các toán hạng (các hằng số, các biến) và các toán tử theo một thứ tự nào đó. Trong biểu thức mệnh đề ta cũng có các biểu thức logic được xây dựng từ:

o Các mệnh đề hoặc các giá trị hằng (chân trị) o Các biến mệnh đề

o Các phép toán logic và cả các dấu () để chỉ rõ thứ tự thực hiện của các phép toán logic.

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<small>GV: LƯU VĂN HIỀNTRANG 11</small> * Thứ tự ưu tiên của các phép tốn trong biểu thức logic:

•  : phép phủ định •   , : phép hội và phép tuyển • →, ↔: phép kéo theo, tương đương

• Ghi chú: các phép tốn trên cùng một dịng có độ ưu tiên ngang nhau, các phép tốn có độ ưu tiên ngang nhau được thực hiện từ trái sang phải, các phép toán trong dấu ngoặc ‘(…)’ được thực hiện trước các phép tốn bên ngồi dấu ngoặc.

<b>Ví dụ: E, F là các biểu thức logic </b>

• E = ((q  p) → (p  r )) 1  • F = p  (q → r)

• Trong 2 biểu thức E, F trên thì p, q, r là các biến mệnh đề.

<b>Bảng chân trị của một biểu thức logic là bảng liệt kê các chân trị của biểu thức dựa </b>

trên các trường hợp chân trị của các biến mệnh đề của biểu thức, mỗi biến mệnh đề sẽ có 2 trường hợp chân trị nên nếu có n biến mệnh đề sẽ có 2 trường hợp chân trị cho mỗi <small>n</small>

<b>Hai biểu thức E và F theo các biến mệnh đề nào đó được gọi là tương đương logic </b>

khi và chỉ khi E và F có cùng chân trị trong mọi trường hợp chân trị của bộ biến mệnh đề. Ký hiệu: E  F (đọc là E tương đương F)

<b>Ví dụ: Xét </b>2 biểu thức E =   q và F = p → q p Lập bảng chân trị như sau:

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<small>GV: LƯU VĂN HIỀNTRANG 12</small>

Theo như bảng chân trị trên ta thấy E và F là 2 biểu thức tương đương 3.<b> Các luật tương đương logic</b>

Các luật logic là cơ sở để ta thực hiện các biến đổi trên một biểu thức logic để có được một biểu thức logic mới tương đương logic với biểu thức logic có trước. Mỗi luật logic cho ta một khẳng định về sự tương đương của 2 biểu thức logic. Ta sẽ sử dụng các quy tắc thay thế và các luật logic đã biết để thực hiện các phép biến đổi tương đương trên các biểu thức logic thường gặp như sau:

<b>Các biểu thức tương đương Tên gọi </b>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<small>GV: LƯU VĂN HIỀNTRANG 13</small>

Trên đây là những luật cơ bản nhất có thể sử dụng để biến đổi các biểu thức logic thành các biểu thức tương đương với nó. Tất nhiên cịn nhiều luật nữa chưa được nêu ra    (luật giao p q hoán) (2)

Từ (1) và (2) suy ra được 2 biểu thức p → q và q  → p là tương đương nhau.

<i><b>Ví dụ 2: Chứng minh p ↔ q và (p q) ( </b></i>˄   p ˄  q) là tương đương nhau.

<i><b>Giải: </b></i>

− Biến đổi biểu thức thứ nhất

p q (p q) (q ↔  → ˄ → p) (luật tương đương)

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<small>GV: LƯU VĂN HIỀNTRANG 14</small> Vậy hai biểu thức p ↔ q và (p ˄ q) (   p ˄  q) là tương đương nhau. 3.1. S gi<b> ự ản ướ</b>c

Mệnh đề g là một giản ước của mệnh đề f nếu như g  f và g có ít các phép toán logic hơn f nhờ các quy luật của hàm logic.

<i><b>Ví dụ: Chứng minh p là giản ước của mệnh đề p ˄</b></i> (p  q) (không dùng bảng chân trị)

<i><b>Giải: p (p q) = (p 0) </b></i>˄   ˄ (p  q) = p  (0 ˄ q) = p Vậy p là giản ước của p ˄ (p  q)

3.2.<b> Đối ngẫ</b>u

Trong một mệnh đề phức hợp, ta thay ˄ bởi , 1 bởi 0 hoặc ngược lại thì ta cũng  được một mệnh đề phức hợp tương đương.

<i><b>Ví dụ: </b></i>

• Mệnh đề p ˄ 1  p là đối ngẫu với mệnh đề p  0 p  • 2 qui tắc của luật De Morgan cũng là hai mệnh đề đối ngẫu.

Gọi p(x) là <b>vị từ </b>chứa biến x, trong đó x khơng phải là biến logic mà x thuộc một miền giá trị U nào đó (còn gọi là tập vũ trụ).

Khi cho x lấy giá trị cụ thể x<small>o</small> U thì khi đó p(x<small>o</small>) là một mệnh đề.

<i><b>Ví dụ:cho P(x): “x lớn hơn 3, x là số thực” (câu này không là mệnh đề) phát biểu </b></i>

này gồm 2 phần: - Biến x

- Tính chất của biến x: lớn hơn 3

Câu này sẽ cho ta mệnh đề ứng với mỗi giá trị cụ thể của x. Với x = 1 thì P(1): “1 > 3” chân trị False.

Với x = 5 thì P(5): “5 > 3” chân trị True.

</div><span class="text_page_counter">Trang 66</span><div class="page_container" data-page="66">

<small>GV: LƯU VĂN HIỀNTRANG 74</small> o Xét tổ hợp chập 3 của tập X = {1, 2, 3, 4, 5}. Tổ hợp đầu là (1, 2, 3). Tổ hợp tiếp theo là (1, 2, 4). Tổ hợp tiếp theo là (1, 2, 5) … Tổ hợp cuối cùng là (3, 4, 5). Ta có được nhận xét là thành phần thứ i trong tổ hợp không thể vượt quá n – k + i. Giá trị này gọi là giá trị cực đại của thành phần thứ i. Ta tìm m = max {i | s < n <small>i</small> – k + i}

1) Khởi tạo dãy xuất phát: Gán s<small>i</small>= i với mọi i = 1, 2, …, k 2) Đưa ra kết quả của tổ hợp đang có s.

3) Nếu thỏa điều kiện kết thúc: s<small>1</small> = n - k + 1 Thuật tốn kết thúc, ngược lại thì chuyển sang bước 4 4) Tìm m thỏa: m = max {i | s < n <small>i</small> – r + i} Đặt s<small>m</small>: = s<small>m + 1</small>.

s : = s + 1 i = m + 1, m + 2, ..., r. <small>ii-1</small>  Quay lại bước 2.

<b>Ví dụ 3: Liệt kê hoán vị. Xét bài toán liệt kê tất cả hoán vị của n phần tử {1, 2, 3, </b>

.., n}. Mỗi hoán vị sẽ được biểu diễn như là một bộ có thứ tự gồm n thành phần a = (a<small>1</small>, a<small>2</small>, , a… <small>n</small>). Như vậy hoán vị đầu tiên là (1, 2, …, n) và hoán vị cuối cùng là (n, n – 1, …, 1)

Giả sử ta phải tìm hốn vị của x = {1, 2, 3}. Các hốn vị có thể được liệt kê theo thứ tự từ điển như: 123, 132, 213, 231, …,321. Giả sử a = (a<small>1</small>, a , <small>2</small> …, a ) là hốn vị <small>n</small> đang có và chưa phải cuối cùng. Khi đó hốn vị kế tiếp sẽ được sinh bằng cách thực hiện các quy tắc sau:

o Tìm từ phải qua trái hốn vị đang có chỉ số j đầu tiên thỏa mãn a<small>j</small> < a <small>j+1</small>

</div><span class="text_page_counter">Trang 67</span><div class="page_container" data-page="67">

<small>GV: LƯU VĂN HIỀNTRANG 75</small> o Tìm a<small>k</small>là số nhỏ nhất cịn lớn hơn a<small>j</small>, trong các số ở bên phải a<small>j</small>

3) Nếu thỏa điều kiện kết thúc s = (n, n – 1, …, 1) Thuật toán kết thúc, ngược lại sang bước 4. 4) Tìm m là chỉ số lớn nhất thỏa s<small>m</small> < s<small>m+1</small> Tìm k là chỉ số lớn nhất thỏa s<small>m</small> < s <small>k</small> Hoán vị s<small>m</small> và s <small>k</small>

Sắp xếp lại s<small>m+ 1</small>, s<small>m + 2</small>, …, s<small>n</small> theo thứ tự tăng dần. Quay lại bước 2.

Nhận xét: Phương pháp sinh khơng có tính phổ dụng: khơng phải cấu hình kế tiếp nào cũng được sinh một cách đơn giản từ cấu hình hiện tại, mặt khác, cấu hình ban đầu khơng phải dễ tìm ra vì ngay cả sự tồn tại của một cấu hình nhiều khi vẫn cịn là nghi vấn. Vì vậy, thơng thường thuật tốn sinh chỉ có thể xây dựng được những bài toán liệt kê tổ hợp đơn giản. Sau đây chúng ta sẽ tìm hiểu phương pháp phổ dụng hơn để giải những bài toán liệt kê phức tạp.

6.3.<b> Phương pháp</b> quay lui

Ý tưởng chính của thuật toán này là xây dựng dần các thành phần của cấu hình bằng cách thử tất cả các khả năng. Giả thiết cấu hình cần được mơ tả bằng một bộ gồm n thành phần x , x , ..., x<small>12n</small>. Giả sử đã xác định được i 1 − thành phần x<small>1</small>, x , ... , x . Ta <small>2i-1</small> xác định thành phần thứ i bằng cách duyệt tất cả khả năng có thể đề cử cho nó (đánh số các khả năng từ 1 đến n<small>i</small>). Với mỗi khả năng j, kiểm tra xem khả năng j có chấp nhận được khơng. Có thể xảy ra 2 trường hợp:

− Nếu chấp nhận j thì xác định x<small>i</small>theo j, sau đó nếu i = n, thì ta được một cấu hình, cịn trái lại ta tiến hành xác định x<small>i+1</small>.

</div><span class="text_page_counter">Trang 68</span><div class="page_container" data-page="68">

<small>GV: LƯU VĂN HIỀNTRANG 76</small> − Nếu thử tất cả khả năng mà khơng khả năng nào được chấp nhận thì quay lại

bước trước để xác định lại x<small>i−1</small>.

Điều quan trọng của thuật toán là phải ghi nhớ, tại mỗi bước đã đi qua, những khả năng đã thử để tránh trùng lặp. Rõ ràng những thông tin này cần được lưu trữ theo cơ cấu ngăn xếp (stack vào sau ra trước). Vì thế thủ tục đệ qui rất phù hợp với thuật - toán này. Bước xác định x<small>i</small> có thể diễn tả qua thủ tục

Phần quan trọng nhất trong thủ tục trên là việc đưa ra được một danh sách các khả năng đề cử và việc xác định giá trị của biểu thức logic <chấp nhận j>. Thơng thường giá trị này ngồi việc phụ thuộc j còn phụ thuộc vào khả năng được chọn ở các bước trước. Vì thế cần ghi nhớ trạng thái mới của quá trình tìm kiếm sau khi <xác định x<small>i</small> theo j> và trả lại trạng thái cũ sau lời gọi Try(i+1) . Các trạng thái này được ghi nhận nhờ một số biến toàn cục (global), gọi là biến trạng thái.

Sau khi xây dựng thủ tục đệ qui Try, chương trình chính giải bài tốn liệt kê có dạng :

{ Init; Try(1); }

trong đó Init là thủ tục khởi tạo các giá trị ban đầu (nhập các giá trị tham số của bài toán, khởi gán các biến trạng thái, biến đếm ...).

<i><b>Ví dụ 1: Liệt kê các dãy nhị phân có độ dài n </b></i>

</div><span class="text_page_counter">Trang 69</span><div class="page_container" data-page="69">

<small>GV: LƯU VĂN HIỀNTRANG 77</small> Ta biểu diễn dãy nhị phân dưới dạng x<small>1</small>, x , ... x<small>2n</small>, trong đó x<small>i</small> {0,1}. Thủ tục Try(i) xác định x<small>i</small> {0,1}. Các giá trị này được mặc nhiên chấp nhận mà không cần phải thoả mãn điều kiện gì (vì thế bài tốn khơng cần biến trạng thái).

<i><b>Ví dụ 2: Liệt kê các hoán vị của {1,2, ..., n} </b></i>

Biểu diễn hoán vị dưới dạng x<small>1</small>, x , ... x , <small>2n</small>trong đó x<small>i</small>  {1, ..., n} và x x2, <small>i</small>  <small>j</small>với i  j. Các giá trị j chạy từ 1 đến n được lần lượt đề cử cho x<small>i</small> và j được chấp nhận nếu nó chưa được dùng. Vì thế cần ghi nhớ đối với mỗi giá trị j xem nó đã được dùng hay chưa. Điều này được thực hiện nhờ dãy biến logic b[j], trong đó b[j] = True nếu j chưa được dùng. Các biến này cần phải được gán giá trị true trong thủ tục Init. Sau khi gán j cho x<small>i</small> cần gán false cho b[j] và gán lại true khi thực hiện xong thủ tục Result hay Try(i+1).

<i><b>Ví dụ 3: Tổ hợp chập r từ n phần tử </b></i>

Xét bài toán liệt kê tất cả tổ hợp chập từ phần tửr n {1, 2,..., n}. Mỗi tổ hợp sẽ được biểu diễn như là dãy [x<small>1</small>, x ,... , x<small>2r </small>] với x < x <... < x<small>12r </small>. Như vậy các giá trị đề cử cho x là từ<small>i</small> x<small>i-1 </small>+ 1 đến n − r + i. Để điều này đúng cho cả trường hợp i = 1 ta thêm vào x <small>0</small>với x<small>0</small> = 0.

</div>

×