+ All Categories
Home > Documents > Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập...

Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập...

Date post: 16-Oct-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
62
VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy Tổng quan về đệ quy 1 Các vấn đề đệ quy thông dụng 2 Phân tích giải thuật & khử đệ quy 3 Các bài toán kinh điển 4
Transcript
Page 1: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

11

Nội dung

Kỹ thuật lập trình đệ quy

Tổng quan về đệ quy1

Các vấn đề đệ quy thông dụng2

Phân tích giải thuật & khử đệ quy3

Các bài toán kinh điển4

Page 2: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

22

Bài toán

Cho S(n) = 1 + 2 + 3 + … + n

=>S(10)? S(11)?

Kỹ thuật lập trình đệ quy

1 ++ 2 ++ …… ++ 10

1 ++ 2 ++ …… ++ 10

== 55

++ 11 == 661 ++ 2 ++ …… ++ 10

==

==

S(10)

S(11)

1 ++ 2 ++ …… ++ 10

S(10)== ++ 11

== ++ 1155 == 66

S(10)

++ 11

55

++ 11

Page 3: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

33

2 bước giải bài toán

Kỹ thuật lập trình đệ quy

==S(n) ++ nS(n-1)

==S(n-1) ++ n-1S(n-2)

==… ++ ……

==S(1) ++ 1S(0)

==S(0) 0

Bước 1. Phân tích

Phân tích thành bài toán đồngdạng nhưng đơn giản hơn. Dừng lại ở bài toán đồngdạng đơn giản nhất có thể xácđịnh ngay kết quả.

Bước 2. Thế ngược

Xác định kết quả bài toánđồng dạng từ đơn giản đếnphức tạp Kết quả cuối cùng.

Page 4: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

44

Một hàm được gọi là đệ qui nếu một lệnh trong thân của hàmđó có lời gọi đến chính hàm đó một cách trực tiếp hoặc giántiếp.

Ví dụ:

void Test()

{

Test();

}

Hoặc tổng S(n) được tính thông qua tổng S(n-1).

Khái niệm đệ quy

Kỹ thuật lập trình đệ quy

Page 5: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

55

Có 2 loại gọi đệ quy:

ĐQ trực tiếp

ĐQ gián tiếp

Khái niệm đệ quy

… Hàm(…){

……Lời gọi Hàm………

}

ĐQ trực tiếp

… Hàm1(…){

……Lời gọi Hàm2………

}

ĐQ gián tiếp

… Hàm2(…){

……Lời gọi Hàmx………

}

Kỹ thuật lập trình đệ quy

Page 6: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

66

Một chương trình đệ quy hoặc một định nghĩa đệquy thì không thể gọi đến chính nó mãi mãi mà phảicó một điểm dừng đến một trường hợp đặc biệt nàođó, mà ta gọi là trường hợp suy biến (degeneratecase)

Ví dụ: Ta định nghĩa n! như sau:

1 0!

1)! -(n *n!n

Khái niệm đệ quy

Kỹ thuật lập trình đệ quy

Page 7: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

77

Hoặc

int GiaiThua(int n) {

int t;if (n==0) return 1;t = n*GiaiThua(n-1); // gọi đệ quireturn t;

}

int GiaiThua(int n) {

if (n==0) return 1;return n*GiaiThua(n-1); // gọi đệ qui

}

Khái niệm đệ quy

Kỹ thuật lập trình đệ quy

Page 8: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

88

Phương pháp thiết kế một giải thuật đệ quy:

Tham số hoá bài toán

Phân tích trường hợp chung : đưa bài toán dướidạng bài toán cùng loại nhưng có phạm vi giảiquyết nhỏ hơn theo nghiã dần dần sẽ tiến đếntrường hợp suy biến

Tìm trường hợp suy biến

Khái niệm đệ quy

Kỹ thuật lập trình đệ quy

Page 9: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

99

Mọi thuật toán đệ quy gồm hai phần quan trọng:

Phần cơ sở: các trường hợp không cần thực hiệnlại thuật toán (không gọi đệ quy), chính là cácđiểm dừng (điều kiện dừng).

Phần đệ quy: có yêu cầu gọi đệ quy, tức yêu cầuthực hiện lại thuật toán với cấp độ dữ liệu thấp hơn(tồn tại bước đệ quy).

Khái niệm đệ quy

Kỹ thuật lập trình đệ quy

Page 10: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1010

Cấu trúc hàm đệ quy

Kỹ thuật lập trình đệ quy

{if (<ĐK dừng>){

…return <Giá trị>;

}

…… Lời gọi Hàm…

}

<Kiểu> <TênHàm>(TS)

Phần dừng(Base step)

• Phần khởi tính toán hoặc điểm kết thúc của thuật toán

• Không chứa phần đang được định nghĩa

Phần đệ quy(Recursion step)

• Có sử dụng thuật toán đang được định nghĩa.

Page 11: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1111

Quy trình hoạt động hàm đệ quy

Ví dụ: Lập hàm tính n! bằng đệ quy

int GT(int n)

{

if (n==0)// điểm dừng

return 1;

else

return n*GT(n-1);

}

1 0!

1)! -(n *n!n

Kỹ thuật lập trình đệ quy

Page 12: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1212

Gọi hàm answer <- GT(5)

CT chính: Chưa xong: answer <- GT(5)

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 13: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1313

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 14: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1414

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 15: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1515

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

GT. 3rd: N=3, Chưa xong: 3*GT(2)

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 16: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1616

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

GT. 3rd: N=3, Chưa xong: 3*GT(2)

GT. 4th: N=2, Chưa xong: 2*GT(1)

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 17: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1717

CT chính: Chưa xong: answer <- GT (5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

GT. 3rd: N=3, Chưa xong: 3*GT(2)

GT. 4th: N=2, Chưa xong: 2*GT(1)

GT. 5th: N=1, Chưa xong: 1*GT(0)

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 18: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1818

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

GT. 3rd: N=3, Chưa xong: 3*GT(2)

GT. 4th: N=2, Chưa xong: 2*GT(1)

GT. 5th: N=1, Chưa xong: 1*GT(0)

GT. 6th: N=0, xong: returns 1

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 19: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

1919

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

GT. 3rd: N=3, Chưa xong: 3*GT(2)

GT. 4th: N=2, Chưa xong: 2*GT(1)

GT. 5th: N=1, xong: returns 1*1

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 20: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2020

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

GT. 3rd: N=3, Chưa xong: 3*GT(2)

GT. 4th: N=2, xong: returns 2*1

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 21: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2121

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, Chưa xong: 4*GT(3)

GT. 3rd: N=3, xong: returns 3*2

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 22: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2222

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, Chưa xong: 5*GT(4)

GT. 2nd: N=4, xong: returns 4*6

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 23: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2323

CT chính: Chưa xong: answer <- GT(5)

GT. 1st: N=5, xong: returns 5*24

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 24: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2424

CT chính: xong: answer <- 120

Minh họa

Quy trình hoạt động hàm đệ quy

Kỹ thuật lập trình đệ quy

Page 25: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2525

Phân loại

Kỹ thuật lập trình đệ quy

2

TUYẾN TÍNHTUYẾN TÍNH

NHỊ PHÂNNHỊ PHÂN

HỖ TƯƠNGHỖ TƯƠNG

PHI TUYẾNPHI TUYẾN

1

3

4

Trong thân hàm có duy nhất mộtlời gọi hàm gọi lại chính nó mộtcách tường minh.

Trong thân hàm có hai lời gọihàm gọi lại chính nó một cáchtường minh.

Trong thân hàm này có lời gọi hàm tớihàm kia và bên trong thân hàm kia cólời gọi hàm tới hàm này.

Trong thân hàm có lời gọi hàm lại chínhnó được đặt bên trong thân vòng lặp.

Page 26: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2626

<Kiểu> TênHàm(<TS>) {if (<ĐK đừng>) {

…return <Giá Trị>;

}… TênHàm(<TS>); …

}

Cấu trúc chương trình

Đệ quy tuyến tính

Kỹ thuật lập trình đệ quy

Tính S(n) = 1 + 2 + … + n S(n) = S(n – 1) + nĐK dừng: S(0) = 0

.: Chương trình :.long Tong(int n){

if (n == 0)return 0;

return Tong(n–1) + n;}

Ví dụ

Page 27: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2727

<Kiểu> TênHàm(<TS>) {if (<ĐK dừng>) {

…return <Giá Trị>;

}… TênHàm(<TS>);…… TênHàm(<TS>);…

}

Cấu trúc chương trình

Đệ quy nhị phân

Kỹ thuật lập trình đệ quy

Tính số hạng thứ n của dãy Fibonacy:f(0) = f(1) = 1f(n) = f(n – 1) + f(n – 2) n > 1ĐK dừng: f(0) = 1 và f(1) = 1

.: Chương trình :.long Fibo(int n){

if (n == 0 || n == 1)return 1;

return Fibo(n–1)+Fibo(n–2);}

Ví dụ

Page 28: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2828

<Kiểu> TênHàm1(<TS>) {if (<ĐK dừng>)

return <Giá trị>;… TênHàm2(<TS>); …

}<Kiểu> TênHàm2(<TS>) {

if (<ĐK dừng>)return <Giá trị>;

… TênHàm1(<TS>); …}

Cấu trúc chương trình

Đệ quy hỗ tương

Kỹ thuật lập trình đệ quy

Tính số hạng thứ n của dãy:x(0) = 1, y(0) = 0x(n) = x(n – 1) + y(n – 1)y(n) = 3*x(n – 1) + 2*y(n – 1)ĐK dừng: x(0) = 1, y(0) = 0

.: Chương trình :.long yn(int n);long xn(int n) {

if (n == 0) return 1;return xn(n-1)+yn(n-1);

}long yn(int n) {

if (n == 0) return 0;return 3*xn(n-1)+2*yn(n-1);

}

Ví dụ

Page 29: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

2929

<Kiểu> TênHàm(<TS>) {if (<ĐK dừng>) {

…return <Giá Trị>;

}… Vòng lặp {

… TênHàm(<TS>); …}…

}

Cấu trúc chương trình

Đệ quy phi tuyến

Kỹ thuật lập trình đệ quy

Tính số hạng thứ n của dãy:x(0) = 1x(n) = n2x(0) + (n-1)2x(1) + … + 22x(n – 2) + 12x(n – 1)ĐK dừng: x(0) = 1

.: Chương trình :.long xn(int n){

if (n == 0) return 1;long s = 0;for (int i=1; i<=n; i++)

s = s + i*i*xn(n–i);return s;

}

Ví dụ

Page 30: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3030

Các bước xây dựng hàm đệ quy

Kỹ thuật lập trình đệ quy

Tìm các trường hợp suy biến (neo)

Tổng quát hóa bài toán cụ thể thành bài toán tổng quát.

Thông số hóa cho bài toán tổng quát

VD: n trong hàm tính tổng S(n), …

Chia bài toán tổng quát ra thành: Phần không đệ quy. Phần như bài toán trên nhưng

kích thước nhỏ hơn. VD: S(n) = S(n – 1) + n, …

Các trường hợp suy biến của bài toán. Kích thước bài toán trong trường hợp

này là nhỏ nhất. VD: S(0) = 0

Tìm thuật giảitổng quát

Thông số hóabài toán

Page 31: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3131

Cơ chế gọi hàm và STACK

Kỹ thuật lập trình đệ quy

{…;A();…;D();…;

}

main()

{…;B();…;C();…;

}

A(){

…;}

C()

{…;D();…;

}

B()

{…;

}

D()

main

A

B C

D

D

M M

A

M

A

B

M

A

M

A

B

M

A

M

A

C

M M M

D

B

D

A

M

ST

AC

K

Thời gian

Page 32: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3232

Nhận xét

Cơ chế gọi hàm dùng STACK trong C phù hợpcho giải thuật đệ quy vì:

Lưu thông tin trạng thái còn dở dang mỗi khigọi đệ quy.

Thực hiện xong một lần gọi cần khôi phụcthông tin trạng thái trước khi gọi.

Lệnh gọi cuối cùng sẽ hoàn tất đầu tiên.

Kỹ thuật lập trình đệ quy

Page 33: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3333

Ví dụ gọi hàm đệ quy

Tính số hạng thứ 4 của dãy Fibonacy

Kỹ thuật lập trình đệ quy

F(4)

F(2)

F(3)

F(1)

F(2)

F(1) F(0)

+

+

+1 12

2 13

3

F(1) F(0)+1 12

25

5

Page 34: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3434

Một số lỗi thường gặp

Công thức đệ quy chưa đúng, không tìm đượcbài toán đồng dạng đơn giản hơn (không hội tụ)nên không giải quyết được vấn đề.

Không xác định các trường hợp suy biến – neo(điều kiện dừng).

Thông điệp thường gặp là StackOverflow do:

Thuật giải đệ quy đúng nhưng số lần gọi đệquy quá lớn làm tràn STACK.

Thuật giải đệ quy sai do không hội tụ hoặckhông có điều kiện dừng.

Kỹ thuật lập trình đệ quy

Page 35: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3535

Bài tập

Viết chương trình cho phép nhập mảng một chiềun phần tử nguyên, sau đó sử dụng kỹ thuật lậptrình đề quy xây dựng hàm:

Tính tổng các phần tử trong mảng.

Tổng các phần tử chẵn trong mảng.

Tìm phần tử nhỏ nhất trong mảng.

Sắp xếp các phần tử trong mảng tăng dần.

Kỹ thuật lập trình đệ quy

Page 36: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3636

Các vấn đề đệ quy thông dụng

Kỹ thuật lập trình đệ quy

Đệ quy??

Page 37: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3737

1.Hệ thức truy hồi

Khái niệm

Hệ thức truy hồi của 1 dãy An là công thứcbiểu diễn phần tử An thông qua 1 hoặc nhiều số hạng trước của dãy.

Kỹ thuật lập trình đệ quy

A0 A1 … A 1An-1A 2An-2 A 1An-1 AnHàm truy hồi

A0 A1 … A 1An-1A 2An-2 A 1An-1 AnA 2An-2 Hàm truy hồi

Page 38: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3838

1.Hệ thức truy hồi

Ví dụ 1

Vi trùng cứ 1 giờ lại nhân đôi. Vậy sau 5 giờsẽ có mấy con vi trùng nếu ban đầu có 2 con?

Giải pháp

Gọi Vh là số vi trùng tại thời điểm h.

Ta có:

• Vh = 2Vh-1

• V0 = 2

Đệ quy tuyến tính với V(h)=2*V(h-1) và điềukiện dừng V(0) = 2

Kỹ thuật lập trình đệ quy

Page 39: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

3939

1.Hệ thức truy hồi

Ví dụ 2

Gửi ngân hàng 1000 USD, lãi suất 12%/năm. Số tiền có được sau 30 năm là bao nhiêu?

Giải pháp

Gọi Tn là số tiền có được sau n năm.

Ta có:

• Tn = Tn-1 + 0.12Tn-1 = 1.12Tn-1

• V(0) = 1000

Đệ quy tuyến tính với T(n)=1.12*T(n-1) vàđiều kiện dừng V(0) = 1000

Kỹ thuật lập trình đệ quy

Page 40: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4040

2.Chia để trị (divide & conquer)

Khái niệm

Chia bài toán thànhnhiều bài toán con.

Giải quyết từng bàitoán con.

Tổng hợp kết quảtừng bài toán con để ra lời giải.

Kỹ thuật lập trình đệ quy

Page 41: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4141

2.Chia để trị (divide & conquer)

Ví dụ 1

Cho dãy A đã sắp xếp thứ tự tăng. Tìm vị tríphần tử x trong dãy (nếu có)

Giải pháp

mid = (l + r) / 2;

Nếu A[mid] = x trả về mid.

Ngược lại

• Nếu x < A[mid] tìm trong đoạn [l, mid – 1]

• Ngược lại tìm trong đoạn [mid + 1, r]

Sử dụng đệ quy nhị phân.

Kỹ thuật lập trình đệ quy

Page 42: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4242

2.Chia để trị (divide & conquer)

Ví dụ 2

Tính tích 2 chuỗi số cực lớn X và Y

Giải pháp

X = X2n-1…XnXn-1…X0, Y = Y2n-1…YnYn-1…Y0

Đặt XL=X2n-1…Xn, XN=Xn-1…X0 X=10nXL+XN

Đặt YL=Y2n-1…Yn, YN=Yn-1…Y0 Y=10nYL+YN

X*Y = 102nXLYL + 10n(XLYL+XNYN)+XNYN

và XLYL+XNYN = (XL-XN)(YN-YL)+XLYL+XNYN

Nhân 3 số nhỏ hơn (độ dài ½) đến khi có thể nhânđược ngay.

Kỹ thuật lập trình đệ quy

Page 43: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4343

2.Chia để trị (divide & conquer)

Một số bài toán khác

Bài toán tháp Hà Nội

Các giải thuật sắp xếp: QuickSort, MergeSort

Các giải thuật tìm kiếm trên cây nhị phân tìmkiếm, cây nhị phân nhiều nhánh tìm kiếm.

Lưu ý

Khi bài toán lớn được chia thành các bài toán nhỏ hơn mà những bài toán nhỏ hơn này không đơn giản nhiều so với bài toán gốc thìkhông nên dùng kỹ thuật chia để trị.

Kỹ thuật lập trình đệ quy

Page 44: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4444

3.Lần ngược (Backtracking)

Khái niệm

Tại bước có nhiều lựa chọn, ta chọn thử 1 bước để đi tiếp.

Nếu không thành công thì “lần ngược” chọnbước khác.

Nếu đã thành công thì ghi nhận lời giải nàyđồng thời “lần ngược” để truy tìm lời giải mới.

Thích hợp giải các bài toán kinh điển như bàitoán 8 hậu và bài toán mã đi tuần.

Kỹ thuật lập trình đệ quy

Page 45: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4545

3.Lần ngược (Backtracking)

Ví dụ

Tìm đường đi từ X đến Y.

Kỹ thuật lập trình đệ quy

X

DA

C

YB

Page 46: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4646

1 2 3

1 3 2

#

$ @

Một số bài toán kinh điển

Kỹ thuật lập trình đệ quy

TÁM HẬU

THÁP HÀ NỘI

PHÁT SINH HOÁN VỊ

MÃ ĐI TUẦN

Page 47: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4747

Tháp Hà Nội

Mô tả bài toán

Có 3 cột A, B và C và cột A hiện có N đĩa.

Tìm cách chuyển N đĩa từ cột A sang cột C sao cho:

• Một lần chuyển 1 đĩa

• Đĩa lớn hơn phải nằm dưới.

• Có thể sử dụng các cột A, B, C làm cột trung gian.

Kỹ thuật lập trình đệ quy

Page 48: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4848

Tháp Hà Nội

Kỹ thuật lập trình đệ quy

Cột nguồn A Cột trung gian B Cột đích C

1…

N-1

1…

N-1N

N-1 đĩa A BN đĩa A C N-1 đĩa B CĐĩa N A C= + +?

Page 49: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

4949

Tám hậu

Mô tả bài toán

Cho bàn cờ vua kích thước 8x8

Hãy đặt 8 hoàng hậu lên bàn cờ này sao chokhông có hoàng hậu nào “ăn” nhau:

• Không nằm trên cùng dòng, cùng cột

• Không nằm trên cùng đường chéo xuôi, ngược.

Kỹ thuật lập trình đệ quy

Page 50: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5050

Tám hậu – Các dòng

Kỹ thuật lập trình đệ quy

0

1

2

3

4

5

6

7

n đường

Page 51: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5151

Tám hậu – Các cột

Kỹ thuật lập trình đệ quy

0 1 2 3 4 5 6 7

n đường

Page 52: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5252

Tám hậu – Các đường chéo xuôi

Kỹ thuật lập trình đệ quy

0

1

2

3

4

5

6

7891011121314

2n-1 đường

Page 53: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5353

Tám hậu – Các đường chéo ngược

Kỹ thuật lập trình đệ quy

0

1

2

3

4

5

6

7 141312111098

2n-1 đường

Page 54: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5454

Tám hậu – Các dòng

Kỹ thuật lập trình đệ quy

j = 3

i = 2

j-i+n-1=8

j+i=5

Page 55: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5555

Mã đi tuần

Mô tả bài toán

Cho bàn cờ vua kích thước 8x8 (64 ô)

Hãy đi con mã 64 nước sao cho mỗi ô chỉ điqua 1 lần (xuất phát từ ô bất kỳ) theo luật:

Kỹ thuật lập trình đệ quy

4 7

3 8

5 6

2 1

Page 56: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5656

Phân tích giải thuật đệ quy

Sử dụng cây đệ quy(recursive tree)

Giúp hình dung bước phân tích và thế ngược.

Bước phân tích: đi từ trên xuống dưới.

Bước thế ngược đi từ trái sang phải, từ dướilên trên.

Ý nghĩa

• Chiều cao của cây Độ lớn trong STACK.

• Số nút Số lời gọi hàm.

Kỹ thuật lập trình đệ quy

Page 57: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5757

Nhận xét

Ưu điểm

Sáng sủa, dễ hiểu, nêu rõ bản chất vấn đề.

Tiết kiệm thời gian thực hiện mã nguồn.

Một số bài toán rất khó giải nếu không dùng đệ qui.

Khuyết điểm

Tốn nhiều bộ nhớ, thời gian thực thi lâu.

Một số tính toán có thể bị lặp lại nhiều lần.

Một số bài toán không có lời giải đệ quy.

Kỹ thuật lập trình đệ quy

Page 58: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5858

Ví dụ cây đệ quy Fibonacy

Kỹ thuật lập trình đệ quy

F(4)

F(2)

F(3)

F(1)

F(2)

F(1) F(0)

F(1) F(0)

Lặp lại

Page 59: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

5959

Khử đệ quy (Tham khảo)

Khái niệm

Đưa các bài toán đệ quy về các bài toán không sửdụng đệ quy.

Thường sử dụng vòng lặp hoặc STACK tự tạo.

Kỹ thuật lập trình đệ quy

Page 60: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

6060

Tổng kết

Nhận xét

Chỉ nên dùng phương pháp đệ quy để giải các bàitoán kinh điển như giải các vấn đề “chia để trị”, “lần ngược”.

Vấn đề đệ quy không nhất thiết phải giải bằngphương pháp đệ quy, có thể sử dụng phương phápkhác thay thế (khử đệ quy)

Tiện cho người lập trình nhưng không tối ưu khichạy trên máy.

Bước đầu nên giải bằng đệ quy nhưng từng bước khử đệ quy để nâng cao hiệu quả.

Kỹ thuật lập trình đệ quy

Page 61: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

6161

Bài tập thực hành

Bài 1: Các bài tập trên mảng sử dụng đệ quy.

Bài 2: Viết hàm xác định chiều dài chuỗi.

Bài 3: Hiển thị n dòng của tam giác Pascal.

a[i][0] = a[i][i] = 1

a[i][k] = a[i-1][k-1] + a[i-1][k]

Bài 4: Viết hàm đệ quy tính C(n, k) biết

C(n, k) = 1 nếu k = 0 hoặc k = n

C(n, k) = 0 nếu k > n

C(n ,k) = C(n-1, k) + C(n-1, k-1) nếu 0<k<n

Kỹ thuật lập trình đệ quy

Page 62: Nội dung - phamthithiet.files.wordpress.com€¦ · VC & BB 1 Nội dung Kỹ thuật lập trình đệ quy 1 Tổng quan về đệquy 2 Các vấn đềđệquy thông dụng

VC&

BB

6262

Bài tập thực hành

Bài 5: Đổi 1 số thập phân sang cơ số khác.

Bài 6: Bài toán 8 hậu

Bài 7: Bài toán mã đi tuần

Bài 8: Tính các tổng truy hồi.

Kỹ thuật lập trình đệ quy


Recommended