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]
(1)Lecturer: PhD Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580
Email: ngohuuphuc76@gmail.com
Cấu trúc liệu giải thuật
(2) Khái niệm đệ quy.
Ví dụ đệ quy.
Đệ quy (Tail Recursion)
Bài tốn tháp Hanoi.
Tham khảo:
(3)3.1 Khái niệm đệ quy (1/6)
Với phần lập trình viên, để giải tốn lớn, có
thể sử dụng trình dạng đệ quy.
Ta nói một đối tượng đệ qui đối tượng bao
gồm phận đối tượng
(4)nó
Trong tính tốn, để giải vấn đề sử dụng hàm đệ quy
(hàm gọi với tham số thay đổi)
Như vậy, hàm đệ quy hàm gọi lại
Với bước, hàm thay đổi thông tin đầu vào cho kết
(5)3.1 Khái niệm đệ quy (3/6)
• Giả sử cần tính giai thừa số nguyên dương n
• Giai thừa n viết: n!, tích phần tử từ n đến • Ví dụ, 5! = (5)(4)(3)(2)(1)
• Có thể thực tính giai thừa 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, cơng thức
tính giai thừa viết dạng:
(6)thừa nhỏ
• Như vậy, ta có n! = n * (n – 1)!
• Ta xử lý (n - 1)! giống n!, với tham số nhỏ • Ta có, (n - 1)! = (n – 1) * (n - 2)!,
• Tương tự, (n - 2)! = (n – 2) * (n - 3)!, trình kết thúc n=1
• Với cách tiếp cận dạng đệ quy, định nghĩa lại cách
(7)3.1 Khái niệm đệ quy (5/6)
Có thể hình dung đệ quy qua bước chính:
quay xi (winding) quay ngược (unwinding)
Tại bước winding, lời giải tốn gọi lại nó.
Với bước winding, lời gọi dừng thỏa mãn
điều kiện dừng
Điều kiện dừng thơng thường định nghĩa
bước đến tốn sở, giải trực tiếp
Với hàm đệ quy cần có điều kiện
(8)được thực hiện, toán nhỏ xem
xét theo thứ tự ngược lại
Bước dừng lại trình đến tốn gốc Q
(9)3.2 Ví dụ đệ quy (1/6)
Bước Winding
F(4) = * F(3) F(3) = * F(2) F(2) = * F(1) F(1) =
Bước UnWinding
F(4) = * = 24 F(3) = * = F(2) = * = F(1) =
Ví dụ 1: Tính n!.
F(n) = n* F(n-1) n >
(10)#include<conio.h>
long factorial(int);
void main()
{
int n;
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;
else return n*factorial(n-1);