1. Hai bước giải toân đệ quy
Bước 1 - Phđn tích: Phđn tích băi tôn thănh băi tôn đồng dạng nhưng đơn
giản hơn vă dừng lại ở băi tơn đồng dạ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 đến
phức tạp để có kết quả cuối cùng.
2. Cấu trúc hăm đệ quy
Một hăm thơng thường gồm 2 phần sau:
<Kiíu_trả_về> <Tín hăm>(<Tham số>) { if (<Điều kiện dừng>) { • • • return <Giâ trị>; } • • •
Lời gọi hăm }
Phần dừng (base step):
phần khởi tính tôn hoặc điểm kết thúc của thuật tôn vă không chứa phần đang định nghĩa.
Phần đệ quy (recursion step): phần sử dụng thuật
tôn đang được định nghĩa.
Để tính n! ta có thể dùng phương phâp lặp như sau: double factor(int n)
double result = 1; for (int i=l; i<=n; i++)
result *= i; return result;
Mặt khâc, n! giai thừa cũng được tính thơng qua (n-1)! bởi cơng thức truy hồi
n! = 1 nếu n = 0
n! = (n-l)!n nếun>0
do đó ta có thể xđy dựng hăm đệ qui tính n! như sau: double factor (int n)
if (n==0) return 1; '//điều kiện dừng
}
else return factor (n-l)*n ; // bước đệ quy
Chương trình tính giai thừa sử dụng giải thuật đệ quy sẽ được viết như sau:
Ví dụ giâ trị truyền văo hăm giai thua qua biến n = 5. Thứ tự gọi thực hiện hăm giaithua:
#include <iostream> using namespace std; double giaithua(int n)
if (n=0) return 1; //điều kiện dừng else return gt(n-l)*n; // bước đệ quy } int main() { 1 int n; cout« "n = "; cin » n; cout« gt(n); system("pause"); return 0; } giaithua(int n) return gt(n-l)*n 5 5 * giaithua(4) = 5 * ? 4 4 * giaithua(3) = 4 * ? 3 3 * giaithua(2) = 3 * ? 2 2 * giaithua(l) = 2 * ?
1 1 * giaithua(O) = 1 * ?
Khi n = 0 thì return về giâ trị 1. Khi gặp giâ trị dừng thì câc giâ trị ? bắt đầu được định trị bằng câch thế ngược lại như sau:
Thế ngược lại: giaithua(int n) 1 return gt(n-l)*n 1 * giaithua(O) =1*1 = 1 2 2 * giaithua(l) =(2 * 1^=2 3 3 * giaithua(2) = 3 * 2^=6 4 4 * giaithua(3) = 4 * 6 = 24 5 5 * giaithua(4) = 5 * 2^= 120