1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Kỹ thuật lập trình: Bài 3 - TS. Ngô Hữu Dũng

30 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 648,65 KB

Nội dung

Bài giảng Kỹ thuật lập trình: Bài 3 do TS. Ngô Hữu Dũng biên soạn cung cấp cho người học các kiến thức: Quy nạp toán học, lập trình đệ quy, cách hoạt động, khái niệm đệ quy, một số loại đệ quy, đệ quy tuyến tính,...

Kỹ thuật lập trình Bài – Giải thuật đệ quy Ngơ Hữu Dũng 61 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Quy nạp toán học   Chứng minh hàm F(n) với số tự nhiên n ≥ N0 Phương pháp quy nạp:    Bước sở: Chỉ trường hợp ban đầu F(N0) Bước quy nạp: Chứng minh giả sử F(k) F(k+1) Ví dụ: Chứng minh S(n): + + + + …+ (2n-1) = n2 (*), với n ≥     62 Bước sở: Trường hợp n = 1, ta có (2n-1) = n2 = hiển nhiên Bước quy nạp: Giả sử S(k) đúng, ta có + + + + (2k – 1) = k2 Khi đó: S(k+1): + + + + (2k – 1) + [2(k+1) – 1] = k2 + (2k + 1) = (k + 1)2 Vậy S(k + 1) = (k + 1)2 Suy S(n) với n ≥ Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Lập trình đệ quy   Lập trình tính S(n) = + + + … + (2n – 1) = n2 với n ≥ Từ toán quy nạp ta có:    Bước sở: S(1) = Bước quy nạp: S(k+1) = S(k) + [2(k + 1) – 1] hay S(k) = S(k – 1) + (2k – 1) Phương pháp lập trình đệ quy: Phần sở: S(1) =  Phần đệ quy: S(n) = S(n – 1) + (2n – 1) int S(int n) {  Áp dụng vào lập trình: if (n==1) return 1; else return S(n-1) + (2*n – 1); }  63 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Cách hoạt động int S(int n) Giả sử n = 5, { hàm đệ quy chạy sau: if (n==1) return 1; else return S(n-1) + S(5) = S(4) + // Gọi hàm S(4) S(4) = S(3) + // Gọi hàm S(3) } // Gọi hàm S(2) S(3) = S(2) + // Gọi hàm S(1) S(2) = S(1) + S(1) = // Return S(1) S(2) = + // Return S(2) // Return S(3) S(3) = + + // Return S(4) S(4) = + + + S(5) = + + + + = 25 = 52 // Return S(5)  64 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng (2*n–1); Khái niệm đệ quy  Khái niệm   Thành phần    Phần sở: Điều kiện thoát Phần đệ quy: Có phép gọi lại Ưu điểm    Một hàm gọi đệ quy có phép gọi lại thân hàm Thuận lợi việc giải tốn có tính chất quy nạp Làm gọn chương trình Nhược điểm  65 Khơng tối ưu, tốn nhớ Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Một số loại đệ quy  Đệ quy tuyến tính (Linear Recursion)   Đệ quy nhị phân, đa đệ quy (Binary Recursion, Multiple Recursion)   Tham số lời gọi đệ quy lời gọi đệ quy Đệ quy hỗ tương (Mutual Recursion)   Lời gọi đệ quy thực cuối hàm đệ quy Đệ quy lồng (Nested Recursion)   Hàm đệ quy gọi lại hai lần nhiều hai lần Đệ quy đuôi (Tail Recursion)   Hàm đệ quy gọi lại lần Hai hàm đệ quy gọi lẫn Đệ quy quay lui (Backtracking)  66 Là hàm đệ quy có phép thử sai Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Đệ quy tuyến tính    Chỉ có lời gọi đệ quy Được dùng thơng dụng Ví dụ  Tính giai thừa Fact(n) với n > Fact(n) = * * *… * n Phần sở: Fact(1) = Phần đệ quy: Fact(n)=n*Fact(n-1)     Tính T(n) = + + + … + n   Phần sở: T(1) = Phần đệ quy: T(n) = T(n-1) + n 7 67 int Fact(int n) { if (n==1) return 1; else return n * Fact(n-1); } int T(int n) { if (n==1) return 1; else return T(n-1) + n; } Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Đệ quy nhị phân    Hàm đệ quy có hai lời gọi đệ quy thời điểm Thường dùng tốn kiểu cấu trúc Ví dụ: Tính số Fibonacci thứ n, với n >   Fib(1) = 1, Fib(2) = Fib(n) = Fib(n-1) + Fib(n-2)  Tính Fib(5) = ?     68 = Fib(4)+Fib(3) = Fib(3)+Fib(2) + Fib(2)+Fib(1) = Fib(2)+Fib(1)+1+1+1 =5 int Fib(int n) { if (n==1 || n==2) return 1; else return Fib(n-1)+Fib(n-2); } Fib(1) Fib(2) Fib(3) Fib(4) Fib(5) 1 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Đệ quy nhiều lần   Lời gọi đệ quy thực nhiều lần hàm Ví dụ: Tính hàm mystery   Hàm có hai lời gọi đệ quy Hàm trả kết ?  Tính mystery(2,4) = ?     69 = mystery(4, 2) = mystery(8, 1) = mystery(16, 0) + = Vậy mystery(2,4) = ? int mystery(int a, int b) { if (b == 0) return 0; if (b % == 0) return mystery(a+a, b/2); else return mystery(a+a, b/2)+a; } Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Đệ quy nhiều lần (tt)   Thay dòng số thành return 1; thay dấu + dấu * int mystery(int a, int b) Hàm trả kết quả? { if (b == 0) return 1; if (b % == 0) return mystery(a*a, b/2); else return mystery(a*a, b/2)*a;  Tính mystery(2,4) = ? = mystery(4,2) = mystery(16,1) = mystery(256,0)*16 = 16      70 } Vậy mystery(2,4) = ? Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Liệt kê dãy nhị phân có độ dài n  Dãy nhị phân gồm phần tử số nhị phân   Có giá trị Ở dòng 10, biến j chạy từ đến   Tương tự, liệt kê dãy bát phân   Biến j chạy từ đến Biến j chạy từ đến 15, tức từ đến F (!?) 76 11 12 13 14 nhiphan(1,4)  10 Tương tự, liệt kê dãy thập lục phân   Bài trước, slide 74-75, biến j chạy từ đến n 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 16 17 18 int so[10]; void in(int n) // In số { for (int i=1;i

Ngày đăng: 11/05/2021, 03:07