Bài giảng Cấu trúc dữ liệu và giải thuật - Đệ qui

Khái niệm

Cấu trúc chương trình

Nguyên lý hoạt động

Ưu và nhược điểm

Bài toán minh hoạ

Tính N!

Tìm số hạng thứ n của dãy Fibonacci

Bài toán tháp Hà Nội

Khử đệ qui

 

ppt36 trang | Chuyên mục: Cấu Trúc Dữ Liệu & Giải Thuật | Chia sẻ: tuando | Lượt xem: 541 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Cấu trúc dữ liệu và giải thuật - Đệ qui, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ĐỆ QUIKhái niệmCấu trúc chương trìnhNguyên lý hoạt độngƯu và nhược điểmBài toán minh hoạTính N!Tìm số hạng thứ n của dãy FibonacciBài toán tháp Hà NộiKhử đệ qui1Khái niệm	Một khái niệm X gọi là định nghĩa theo đệ qui nếu trong chính định nghĩa X có sử dụng khái niệm X	Ví dụ:Định nghĩa Số tự nhiên:0 là một số tự nhiênn > 0 là số tự nhiên nếu n – 1 là số tự nhiên	Định nghĩa n giai thừa0! = 1Nếu n >0 thì n! = n* (n-1)!2Cấu trúc chương trìnhChương trình đệ qui gồm hai phần chính:Điều kiện thoát khỏi đệ quiTrong phần thân chương trình có lời gọi đến chính bản thân chương trình với giá trị mới của tham số nhỏ hơn giá trị ban đầu.3Cấu trúc chương trình( tiếp)Chươngtrình A(x) {	If (điều kiện thoát đệ qui)	Kết thúc đệ qui;	.	ChươngtrìnhA(x’);	.}Với x’ 0, N! = N*(N-1)!Ví dụ: Tính 5!5! = 5*4! =5*4*3! = 5*4*3*2! = 5*4*3*2*1! = 5*4*3*2*1*0! =5*4*3*2*1*1 = 1206Bài toán tính N!(tiếp)GiaiThừa(n)Bước 1: Nếu n = 0 thì GiaiThừa =1,ngược lại	GiaiThừa = n*GiaiThừa(n-1)	7Bài toán tính N!(tiếp)Function GiaiThua(n: interger) : integer; Begin	if(n=0) then GiaiThua =1	else	GiaiThua = n*GiaiThua(n-1);End;8Bài toán tính N!(tiếp)Program GiaiThua;Uses crt;Var n,kq: integer;Begin	Clrscr;	Write(‘Moi ngai nhap so n=‘);readln(n);	Kq=GiaiThua(n);	Write(‘Gia tri’, n,’!’, = ‘,kq :5);	Readln;End. 9GIAITHUA(3)Nguyên lý hoạt độngKhi ta thực hiện gọi hàm Giai thừa: GiaiThừa(5)GIAITHUA(5)GIAITHUA(4)GIAITHUA(2)GIAITHUA(1)GIAITHUA(0)GIAITHUA(3)GIAITHUA(5)GIAITHUA(4)GIAITHUA(2)GIAITHUA(1)GIAITHUA(0)GIAITHUA(3)GIAITHUA(5)GIAITHUA(4)GIAITHUA(2)GIAITHUA(1)GIAITHUA(3)GIAITHUA(5)GIAITHUA(4)GIAITHUA(2)GIAITHUA(3)GIAITHUA(5)GIAITHUA(4)GIAITHUA(5)GIAITHUA(4)GIAITHUA(5)10Nguyên lý hoạt động (tiếp)Các lời gọi hàm lần lượt được cất vào bộ nhớ Khi thực hiện, lần lượt thực hiện theo thứ tự “vào sau ra trước” 11Ưu điểmThích hợp với các bài toán có bản chất đệ quySáng sủaDễ hiểuThể hiện được bản chất của bài toánChương trình ngắn gọn12Nhược điểmTốc độ thực hiện chương trình chậmLỗi “Tràn stack”13Bài toán tìm số hạng thứ n của dãy FibonacciSố hạng thứ n của dãy fibonacci được định nghĩa:F0 = 1F1 = 1Fn =Fn-1 + Fn-2Ví dụ:1,1,2,3,5,8,13,21,34,55,. là dãy fibonacci14Bài toán tìm số hạng thứ n của dãy Fibonacci (tiếp)InputCho n là số tự nhiênOutputTính số hạng thứ n của dãy fibonacci15Bài toán tìm số hạng thứ n của dãy Fibonacci (tiếp)Điều kiện thoát khỏi đệ quiN0) then	begin	ChuyenDia(n-1,A,B,C);	Chuyen1Dia(A,B);	ChuyenDia(n-1,C,A,B);	end;	End;Procedure Chuyen1Dia( A :char, B: char);begin	write(‘Chuyển từ dia‘,A,’ -> sang dia’,B);End;32Bài toán tháp Hà nội - Thuật toán (tiếp)Program ThapHaNoi;Uses crt;Var i:integer; A,B,C :char;	Begin	clrscr;	Write(‘Mời ngài cho biết số đĩa’);readln(n);	ChuyenDia(n,A,B,C);	Readln;End.33Khử đệ qui Thay thế lời gọi đệ qui trong chưong trình bằng các lệnh khác để giải quyết bài toán.VD: Khử đệ qui bài tính n!function GiaiThua(n: integer): integer;Var T,i:integer;Begin	T=1;	if (n>0) then	for i=0 to n do T = T*i;	GiaiThua =T;End;34Khử đệ qui (tiếp) Khử đệ qui: tìm số thứ n của dãy fibonacci:Function Fibonacci(n: integer): integer;Var i,a,b,kq: integer;Begin	if (n=0) then kq=1	else if(n=1) then kq=1	 else	begin	 i=1;a =0;b=1;	 while(i<=n) do	 begin	 	i++;	a =a+b;b= a-b;	 end;	 kq=x;	 	end;	Fibonacci = kq;	End;35Bài tậpViết chương trình sử dụng đệ qui để tìm USCLN của hai số tự nhiên a,b.Viết chương trình sử dụng đệ qui để tính C(n,k) = n! / (n-k)!k!Với:	C(n,n)=1	C(n,0)=1	C(n,k) = C(n-1,k-1) +C(n-1,k) 0<k<nViết thủ tục đệ qui thực hiện in ngược một dòng ký tự cho trước. (vd: “PASCAL” thì in ra “LACSAP”)36

File đính kèm:

  • pptbai_giang_cau_truc_du_lieu_va_giai_thuat_de_qui.ppt