Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
15,14 MB
Nội dung
Môn: CẤU TRÚC DỮ LIỆU Chương 3: LẬP TRÌNH ĐỆ QUY ĐỆ QUY (Recursion) Định nghĩa: Phương pháp thiết kế giải thuật đệ quy : Phân loại đệ quy: ĐỆ QUY (Recursion) Định nghĩa: Chương trình đệ quy chương trình gọi đến Ví dụ: Một hàm đệ quy hàm định nghĩa dựa vào Trong lý thuyết tin học, người ta thường dùng thủ thuật đệ quy để định nghĩa đối tượng Ví dụ: Tên biến Pascal chuẩn định nghĩa sau: - Mỗi chữ tên - Nếu t tên biến t , t tên biến ĐỆ QUY (Recursion) Định nghĩa: Một chương trình đệ quy định nghĩa đệ quy gọi đến mãi mà phải có điểm dừng đến trường hợp đặc biệt đó, mà ta gọi trường hợp suy biến (degenerate case) Ví dụ: Cho số tự nhiên n, ta định nghĩa n! sau: n * (n - 1)! n! = 0! ĐỆ QUY (Recursion) Phương pháp thiết kế giải thuật đệ quy : Tham số hoá toán Phân tích trường hợp chung (đưa toán dạng toán loại có phạm vi giải nhỏ theo nghiã tiến đến trường hợp suy biến) Tìm trường hợp suy biến ĐỆ QUY (Recursion) Phương pháp thiết kế giải thuật đệ quy : Ví dụ1: Lập hàm GT(n) = n! int GT(int n){ If (n==0) return 1; Else return n*GT(n-1); } ĐỆ QUY (Recursion) Phương pháp thiết kế giải thuật đệ quy : Ví dụ2: Dãy số Fibonaci: F1 = F2 = 1; Fn = Fn-1 + F n-2 (n 3) int F(int n){ If (n==1||n==2) return 1; Else return F(n-1)+F(n-2); } ĐỆ QUY (Recursion) Phương pháp thiết kế giải thuật đệ quy : Nhận xét: ◦ Thông thuờng thay sử dụng lời giải đệ quy cho toán, ta thay lời giải không đệ quy (khử đệ quy) phương pháp lặp ◦ Việc sử dụng giải thuật đệ quy có: Ưu điểm lợi cho việc biểu diễn toán Gọn (đối với chương trình) Khuyết điểm Thuận Có không tối ưu thời gian Có thể gây tốn nhớ ◦ Chính vậy, lập trình người ta cố tránh sử dụng thủ tục đệ quy thấy không cần thiết ĐỆ QUY (Recursion) Ví dụ 1: Viết thủ tục in xâu đảo ngược xâu X Cách 1: -Trường hợp chung: + In ký tự cuối xâu X + Đảo ngược phần lại -Trường hợp suy biến: Nếu xâu rỗng không làm hết void InNguoc(char*X){ If (X !=“”){ cout[...]...ĐỆ QUY (Recursion) Tham số hoá bài toán: HaNoi(n, A, B, C) // A, B, C: char Trong đó: n: Số đĩa A: Cọc nguồn cần chuyển đĩa đi B: Cọc trung gian C: Cọc đích để chuyển đĩa đến Chương trình chính như sau: void main(){ A= 'A'; B= 'B'; C= 'C'; HaNoi(3, A, B, C); } ĐỆ QUY (Recursion) Giải thuật đệ quy: Trường hợp suy biến: Nếu n = 1 thì chuyển đĩa từ... Chuyển đĩa thứ nhất từ B sang C Tổng quát: + Chuyển (n -1) đĩa từ A sang B (C làm trung gian) + Chuyển 1 đĩa từ A sang C (B: trung gian) + Chuyển (n -1) đĩa từ B sang C (A: trung gian) ĐỆ QUY (Recursion) Giải thuật đệ quy: void HaNoi(int n, char A, char B, char C){ If (n==1) cout ...ĐỆ QUY (Recursion) Định nghĩa: Phương pháp thiết kế giải thuật đệ quy : Phân loại đệ quy: ĐỆ QUY (Recursion) Định nghĩa: Chương trình đệ quy chương trình gọi đến Ví dụ: Một hàm đệ quy. .. thiết kế giải thuật đệ quy : Nhận xét: ◦ Thông thuờng thay sử dụng lời giải đệ quy cho toán, ta thay lời giải không đệ quy (khử đệ quy) phương pháp lặp ◦ Việc sử dụng giải thuật đệ quy có: Ưu điểm... pháp thiết kế giải thuật đệ quy : Ví dụ2: Dãy số Fibonaci: F1 = F2 = 1; Fn = Fn-1 + F n-2 (n 3) int F(int n){ If (n==1||n==2) return 1; Else return F(n-1)+F(n-2); } ĐỆ QUY (Recursion) Phương