V ới phần lập trình viên, để giải quyết bài toán lớn, có.. th ể sử dụng 1 quá trình dạng đệ quy.[r]
Trang 1Lecturer: PhD Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580
C ấu trúc dữ liệu và giải thuật
Bài 3 Đệ quy (Recursion)
Trang 2 Khái ni ệm về đệ quy.
Ví d ụ về đệ quy.
Đệ quy đuôi (Tail Recursion)
Bài toán tháp Hanoi.
Tham kh ảo:
1. Kyle Loudon – Mastering Algorithms with C
Trang 33.1 Khái ni ệm về đệ quy (1/6)
V ới phần lập trình viên, để giải quyết bài toán lớn, có
th ể sử dụng 1 quá trình dạng đệ quy.
Ta nói m ột đối tượng là đệ qui nếu đối tượng này bao
g ồm chính nó như một bộ phận hoặc đối tượng được định nghĩa dưới dạng của chính nó.
Trang 4nó
Trong tính toán, để giải quyết vấn đề sử dụng hàm đệ quy (hàm gọi chính nó với tham số thay đổi)
Như vậy, hàm đệ quy là hàm gọi lại chính nó
Với mỗi bước, hàm thay đổi thông tin đầu vào và cho kết
quả ngày càng gần với mục tiêu của bài toán
Trang 53.1 Khái ni ệm về đệ quy (3/6)
• Giả sử cần tính giai thừa của một số nguyên dương n
• Giai thừa của n được viết: n!, tích các phần tử từ n đến 1
• Ví dụ, 5! = (5)(4)(3)(2)(1)
• Có thể thực hiện tính giai thừa bằng vòng lặp thông thường
để tính tích
• Một cách tiếp cận khác, sử dụng đệ quy, khi đó công thức tính giai thừa được viết dạng:
n! = (n)(n - 1)(n - 2) (1)
Trang 6thừa nhỏ hơn
• Như vậy, ta có n! = n * (n – 1)!
• Ta xử lý (n - 1)! giống như n!, với tham số nhỏ hơn.
• Ta có, (n - 1)! = (n – 1) * (n - 2)!,
• Tương tự, (n - 2)! = (n – 2) * (n - 3)!, quá trình trên kết thúc
khi n=1
• Với cách tiếp cận dạng đệ quy, có thể định nghĩa lại cách tính giai thừa dạng:
Trang 73.1 Khái ni ệm về đệ quy (5/6)
( unwinding )
T ại bước winding , l ời giải bài toán gọi lại chính
nó.
Với bước winding, lời gọi chính nó dừng khi thỏa mãn
điều kiện dừng
Điều kiện dừng thông thường được định nghĩa là tại
bước đó đã đến bài toán cơ sở, có thể giải trực tiếp được
Với mỗi hàm đệ quy cần có ít nhất một điều kiện
dừng, nếu không sẽ lặp vô hạn
Trang 8được thực hiện, các bài toán nhỏ trên được xem xét theo th ứ tự ngược lại
Bước này dừng lại khi quá trình đến bài toán gốc Quá trình đệ quy kết thúc
Trang 93.2 Ví d ụ về đệ quy (1/6)
Bước Winding
F(4) = 4 * F(3)
F(3) = 3 * F(2)
F(2) = 2 * F(1)
F(1) = 1
Bước UnWinding
F(4) = 4 * 6 = 24 F(3) = 3 * 2 = 6 F(2) = 2 * 1 = 2 F(1) = 1
Ví d ụ 1: Tính n!.
F(n) = n* F(n-1) nếu n > 1
F(n) = 1 nếu n = 1 hoặc n = 0
Tính F(4) = ?
Trang 10# include <conio.h>
long factorial( int );
{
printf("Nhap vao mot so: ");
scanf("%d",&n);
printf("Gia tri cua giai thua:
%ld",factorial(n));
getch();
}
if ((n==0)||(n==1)) return 1;
}