1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tài liệu về đệ quy và đệ quy nâng cao

54 1.2K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Tài liệu về đệ quy và đệ quy nâng cao . Bao gồm kỹ thuật giải đệ quy , khử đệ quy dùng đệ quy để giải các bài toán phức tạp ... Luận văn cao học được trình bày chi tiết và cẩn thận bởi các thạc sĩ trường đhqg hà nội khoa toán tin

MỤC LỤC Lời cảm ơn LỜI NÓI ĐẦU Trong trình nghiên cứu giải vấn đề - toán, người ta đưa nhận xét sau: − Có nhiều toán chưa tìm cách giải theo kiểu thuật toán có tồn thuật toán hay không; − Có nhiều toán có thuật toán để giải không chấp nhận thời gian giải theo thuật toán lớn điều kiện cho thuật toán khó áp dụng; − Có toán giải theo cách giải vi phạm thuật toán chấp nhận Thuật toán đệ quy mở rộng khái niệm thuật toán Như biết, thuật toán cần phải thỏa mãn tính chất: − Tính hữu hạn; − Tính xác định; − Tính đắn Tuy nhiên, có toán mà việc xây dựng thuật toán với đầy đủ ba tính chất khó khăn Trong đó, ta xây dựng thuật toán vi phạm vài tính chất cách giải lại trở nên đơn giản nhiều chấp nhận Một trường hợp thuật toán đệ quy Khi thực đề tài này, mục đích em tìm hiểu vấn đề nhất, lý thuyết tảng thuật toán đệ quy thấy rõ ưu điểm đệ quy việc đơn giản hóa trình tính toán, giải số toán khó, toán điển hình có tính ứng dụng thực tiễn Đồng thời cài đặt đệ quy máy tính đôi lúc lại không đơn giản phát biểu đệ quy, từ giới thiệu phương pháp khử đệ quy mục đích, ý nghĩa phương pháp khử đệ quy Bố cục luận văn chia làm chương: Chương I: TỔNG QUAN VỀ ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QUY Chương II: MỘT SỐ BÀI TOÁN GIẢI BẰNG GIẢI THUẬT ĐỆ QUY ĐIỂN HÌNH Chương III: KHỬ ĐỆ QUY KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI Với thời gian làm đề tài không dài, vốn kiến thức tiếp thu hạn chế chưa có kinh nghiệm lập trình nên khóa luận em không tránh khỏi thiếu sót, em mong nhận đóng góp phê bình thầy cô bạn để khóa luận hoàn thiện hơn! CHƯƠNG I TỔNG QUAN VỀ ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QUY 1.1 Khái niệm đệ quy Đệ quy khái niệm tồn thực tế sống, toán học ngôn ngữ lập trình Sau số tượng có tính đệ quy thực tế sống Bộ Matruska mặt hàng mỹ nghệ tiếng giới nghệ nhân người Nga mà xuất Việt Nam Một to có bụng rỗng, thân chia thành hai phần hộp, mở nắp có bé nằm bụng Con lật đật thứ hai lớn hơn, mở nắp thấy bé nằm bụng nó, lại mở ta lại bé Xếp tất lật đật cạnh ta thấy chúng có hình dáng giống kích thước lồng chúng vào ta thấy dường chứa hình ảnh thân Hiện tượng thứ hai quen thuộc hơn, theo dõi chương trình “cầu truyền hình” đài truyền hình Việt Nam, tượng lý thú mà ta nhìn thấy ngồi xem truyền hình Trên ảnh tivi ta nhìn thấy hướng dẫn viên truyền hình nói, bên cạnh tivi dùng để phát lại cảnh trường quay, ảnh tivi ta lại thấy hình ảnh nó, chuỗi hình ảnh tivi lồng vào Cả hai tượng mà ta thấy nhiều tượng khác tương tự có tính chất chung, đối tượng bao hàm hình ảnh ta gọi tượng đệ quy Một vấn đề đặt là: tượng đệ quy mà ta xét phần mang tính chất tự nhiên sống đời thường Vậy toán học, thường đối tượng thông qua đối tượng khác, liệu có tượng đối tượng tính toán dựa kiện không? Có thể trả lời câu hỏi thông qua số ví dụ sau: Ví dụ 1: Tính giai thừa số tự nhiên n (ký hiệu n!) n! tính sau: − Nếu n = n! = 1; − Nếu n > n! = n(n-1)! Ví dụ 2: Tính giá trị a n với a số thực khác không n số nguyên không âm ( n = 0) 1 an =  a a n −1 (n > 0) Ví dụ 3: Tìm phần tử thứ n cấp số cộng có số hạng đầu a, công sai r a u n = r + u n −1  ( n = 1) (n > 1) Ví dụ 4: Tìm phần tử thứ n cấp số nhân có số hạng đầu a, công bội q a un =  q * u n−1 ( n = 1) ( n > 1) Trong ví dụ cho thấy, khái niệm toán học cho ta phương pháp ngắn gọn mô tả số đối tượng Khái niệm: Ta nói đối tượng đệ quy (recursive algorithm) định nghĩa qua đối tượng khác dạng với quy nạp 1.2 Giải thuật đệ quy 1.2.1 Khái niệm giải thuật đệ quy Nếu lời giải toán P thực lời giải toán P’ có dạng giống P lời giải đệ quy Giải thuật tương ứng với lời giải gọi giải thuật đệ quy Mới nghe lạ điểm mấu chốt cần lưu ý là: P’ có dạng giống P, theo định nghĩa P’ phải “nhỏ” P, dễ giải P việc giải không cần dùng đến P Hãy xét toán tìm từ từ điển Có thể nêu giải thuật sau: If (Từ điển trang) then (Tìm từ trang này) Else Begin Mở từ điển vào trang “giữa”; Xác định xem nửa từ điển chứa từ cần tìm; If (Từ nằm nửa trước từ điển) then (Tìm từ nửa trước) Else (Tìm từ nửa sau); End; Tất nhiên giải thuật nêu dạng “thô” nhiều chỗ chưa cụ thể, chẳng hạn: − Tìm từ trang làm nào? − Thế mở từ điển vào trang giữa? − Làm để biết từ nằm nửa từ điển? Để trả lời rõ câu hỏi khó, ta không sa vào chi tiết mà muốn tập trung vào việc xét “chiến thuật” lời giải Có thể hình dung chiến thuật tìm kiếm cách khái quát sau: Tìm từ từ điển Tìm từ từ điển nửa sau Tìm từ từ điển nửa trước Hình 1.1 Mô tả đệ quy tìm từ từ điển Ta thấy có hai điểm cần lưu ý: Sau lần từ điển tách đôi nửa thích hợp lại tìm kiếm “chiến thuật” dùng trước Có trường hợp đặc biệt, khác với trường hợp trước, đạt sau nhiều lần tách đôi, trường hợp từ điển trang Lúc việc tách đôi ngừng lại toán trở thành đủ nhỏ để ta giải trực tiếp cách tìm từ mong muốn trang chẳng hạn cách tìm Trường hợp đặc biệt gọi trường hợp suy biến (degenerate case) Có thể coi “chiến thuật” kiểu “chia để trị” (devide and conquer) Bài toán tách thành toán nhỏ toán nhỏ lại giải với thuật chia để trị trước, xuất trường hợp suy biến Ta thể giải thuật tìm kiếm dạng thủ tục: Procedure TIMKIEM (TD,Tu) {TD coi đầu mối để truy nhập vào từ điển xét, Tu từ cần tìm} If (Từ điển trang) then (Tìm từ trang này) Else Begin Mở từ điển vào trang “giữa”; Xác định xem nửa từ điển chứa từ Tu; If (Từ nằm nửa trước từ điển) then call TIMKIEM (TD1,Tu) Else call TIMKIEM (TD2,Tu) End; {TD1 TD2 đầu mối để truy nhập vào nửa trước nửa sau từ điển} Return Thủ tục gọi thủ tục đệ quy Từ đó, nêu đặc điểm sau: − Trong thủ tục đệ quy có lời gọi đến thủ tục Ở đây, thủ tục TIMKIEM có call TIMKIEM; − Mỗi lần có lời gọi lại thủ tục kích thước toán thu nhỏ trước Ở đây, có call TIMKIEM kích thước “nửa” trước đó; − Có trường hợp đặc biệt: Trường hợp suy biến Đó trường hợp mà từ điển trang Khi trường hợp xảy toán lại giải theo cách khác hẳn gọi đệ quy kết thúc Chính tình trạng kích thước toán giảm dần đảm bảo dẫn tới trường hợp suy biến 1.2.2 Bố cục chương trình đệ quy Phương pháp đệ quy mạnh chỗ cho phép mô tả tập lớn đối tượng số mệnh đề mô tả giải thuật phức tạp số thao tác (một chương trình đệ quy) Một chương trình đệ quy gồm hai phần: − Phần neo (anchor): Tương ứng với trường hợp suy biến, thông thường trường hợp suy biến ta biết lời giải toán Một chương trình đệ quy thiết phải có phần suy biến này, chương trình bị rơi vào tình trạng gọi đệ quy vô hạn lần chương trình tiếp tục − Phần đệ quy: Tương ứng với trường hợp tổng quát, qui toán toán tương tự cách gọi tới chương trình với liệu “đơn giản hơn”, thông thường toán có kích thước nhỏ toán ban đầu Phần đệ quy thể tính “quy nạp” lời giải Ví dụ: Tính giai thừa số tự nhiên n: 1 n * GT (n − 1) GT(n) =  (n = 0) (n > 0) (1) (2) Khi đó: (1) phần neo; (2) phần đệ quy 1.2.3 Phương pháp tìm giải thuật đệ quy cho toán Để xây dựng giải thuật toán có tính đệ quy phương pháp đệ quy ta cần thực nội dung sau: − Thông số hóa toán; − Tìm trường hợp neo giải thuật giải tương ứng; − Tìm giải thuật giải trường hợp tổng quát phân rã toán theo kiểu đệ quy 1.2.3.1 Thông số hóa toán Tổng quát hóa toán cụ thể cần giải thành toán tổng quát (một họ toán chứa toán cần giải), tìm thông số cho toán tổng quát đặc biệt nhóm thông số biểu thị kích thước toán - thông số điều khiển (các thông số mà độ lớn chúng đặc trưng cho độ phức tạp toán giảm qua lần gọi đệ quy) Ví dụ: n hàm GiaiThua(n); m, n hàm USCLN(n,m) 1.2.3.2 Phát trường hợp neo (suy biến) tìm giải thuật cho trường hợp Đây trường hợp suy biến toán tổng quát, trường hợp tương ứng với giá trị biên biến điều khiển (trường hợp kích thước toán nhỏ nhất) mà giải thuật không đệ quy (thường đơn giản) Ví dụ: GiaiThua(0) = 1; USCLN(m,n) = m m = n 1.2.3.3 Tìm thuật giải trường hợp tổng quát Tìm phương án (giải thuật) giải toán tổng quát cách phân chia thành thành phần mà có giải thuật không đệ quy toán có kích thước nhỏ Ví dụ: GiaiThua = n*GiaiThua(n-1) 1.3 Phân loại đệ quy 1.3.1 Phân loại theo mô tả đệ quy Trong nhiều tình việc mô tả toán, giải thuật, kiện, vật, trình, cấu trúc đơn giản hiệu ta nhìn góc độ mang tính đệ quy Mô tả mang tính đệ quy đối tượng mô tả theo cách phân tích đối tượng thành nhiều thành phần mà số thành phần có thành phần 10 Pithago(x4,y4,length*cos(angle2),angle1+angle2,angle2, depth-1); Pithago(x3+length*sin(angle2)*cos(pi/2+angle1+angle2), y3-length*sin(angle2)*sin(pi/2+angle1+angle2),length* sin(angle2),angle1+angle2-pi/2,angle2,depth-1); End; End; Giải thuật có độ phức tạp T(n) = O(2 n ) Hình 2.13 Cây Pitago Một số đường fractal khác: Đường Dragon Đường Von koch snow flake Hình tròn xoáy ốc Hình vuông Sierpinski 2.14 Một số đường fractal khác 40 CHƯƠNG III KHỬ ĐỆ QUY Một cách tổng quát người ta rằng: giải thuật đệ quy thay giải thuật không đệ quy Vấn đề lại kỹ thuật xây dựng giải thuật không đệ quy tương ứng thay giải thuật đệ quy Rất đáng tiếc việc xây dựng giải thuật không đệ quy thay cho giải thuật đệ quy có lại việc đơn giản đến chưa có phương pháp thỏa đáng cho trường hợp tổng quát 3.1 Cơ chế thực giải thuật đệ quy Trạng thái tiến trình xử lý giải thuật thời điểm đặc trưng nội dung biến lệnh cần thực Với tiến trình xử lý giải thuật đệ quy thời điểm thực hiện, cần lưu trữ trạng thái xử lý dang dở Ví dụ 1: Giải thuật đệ quy tính giai thừa GT(n) ≡ if (n = 0) then return Else return (n * GT(n-1)); Sơ đồ trình tính giá trị 3! Theo giải thuật đệ quy: GT(3) = * GT(2) GT(2) = * GT(1) GT(1) = * GT(0) GT(0) = Hình 3.1 Sơ đồ trình tính giá trị 3! Khi thực lời gọi GT(3) phát sinh lời gọi GT(2), đồng thời phải lưu giữ thông tin trạng thái xử lý dang dở (GT(3) = * GT(2)) Đến lượt 41 lời gọi GT(2) lại làm phát sinh lời gọi GT(1), đồng thời phải lưu trữ thông tin trạng thái xử lý dang dở (GT(2) = * GT(1)) Cứ gặp lời gọi trường hợp neo (GT(0) = 1) Tiếp theo trình gọi trình xử lý ngược thực hiện: − Dùng giá trị GT(0) để tính GT(1) theo sơ đồ xử lý lưu trữ; − Dùng giá trị GT(1) để tính GT(2) theo sơ đồ xử lý lưu trữ; − Dùng giá trị GT(2) để tính GT(3) theo sơ đồ xử lý lưu trữ Đồng thời với trình xử lý ngược trình xóa bỏ thông tin giải thuật xử lý trung gian (quá trình thu hồi vùng nhớ) Ví dụ 2: Giải thuật đệ quy tính giá trị hàm FIBONACCI F(n) ≡ if (n ≤ 1) then F := Else F := F(n-2) + F(n-1); Sơ đồ tính giá trị F(5): F[5] F[3] F[1] F[4] F[2] F[0] F[2] F[1] F[3] F[1] F[0] F[2] F[1] F[0] F[1] Hình 3.2 Sơ đồ tính giá trị số hạng thứ dãy fibonacci Khi thực lời gọi F(5) phát sinh lời gọi F(3) tiếp đến lời gọi F(4), đến lượt F(3) lại dẫn đến lời gọi F(1) F(2), đến lượt F(1) (rơi vào trường hợp neo) giá trị trả cho hàm, giá trị lưu tạm để chờ thực F(2) kết F(3) 42 Nhận xét: Đệ quy phương pháp giúp tìm giải thuật cho toán khó Giải thuật giải toán đệ quy có ưu điểm như: − Nó định nghĩa tập lớn tác động số hữu hạn mệnh đề; − Chương trình thường ngắn gọn dễ cảm nhận (gọn gàng, dễ hiểu, dễ chuyển thành chương trình NNLT); − Bản chất đệ quy ý tưởng quy nạp hay hạ bậc toán học nghĩa đưa số vấn đề phức tạp số vấn đề đơn giản hơn; − Cần lưu ý đệ quy phương pháp lập trình quan trọng mà phương pháp suy nghĩ để giải vấn đề cách tổng quát dựa ý tưởng: • Đơn giản hóa công việc; • Phân vùng để xử lý − Lập trình đệ quy phương tiện hiệu để tổ chức thao tác tìm kiếm phức tạp tập hợp khả có Nhưng việc xử lý giải thuật đệ quy lại thường gây khó khăn cho máy tính (tốn không gian nhớ thời giãn xử lý), NNLT cho phép mã hóa giải thuật đệ quy (ví dụ: Assembly, Fortran) Vì việc thay chương trình đệ quy (có chứa chương trình đệ quy) chương trình không đệ quy vấn đề quan tâm nhiều lập trình 3.2 Khái niệm khử đệ quy 3.2.1 Khái niệm Việc viết chương trình có lời gọi đệ quy cho ta số lời giải đẹp ngắn gọn cho số toán Nhưng việc thực chương trình có đệ quy lúc nhanh suôn sẻ mô tả chúng Ta thấy việc thực chương trình đệ quy, lần gọi chương trình đệ quy tạo tập biến cục Nếu chủ động quản lý giá trị trung gian ngăn xếp thay lời gọi đệ quy vòng 43 lặp thu chương trình tương đương lời gọi đệ quy Một chương trình gọi khử đệ quy Hay nói khác đi, khử đệ quy bỏ lời gọi đệ quy thay vào việc sử dụng chế lặp với hỗ trợ ngăn xếp 3.2.2 Mục đích ý nghĩa khử đệ quy Quan điểm phổ biến người lập trình sử dụng đệ quy tốn thời gian nhớ, quan điểm nảy sinh tính chất bí ẩn chương trình đệ quy mang lại Một lời khuyên chuyên gia lập trình nên tránh xa đệ quy Nhưng điều chưa Chúng ta thấy chương trình đệ quy mô tả ngắn gọn dễ hiểu Hơn nữa, có thực nghiệm chứng tỏ có chương trình đệ quy thực nhanh dạng khử đệ quy chúng (một số chí nhanh hơn) Thực tế có nguyên nhân việc bố trí tối ưu mã chương trình dịch, sử dụng tối ưu tài nguyên máy tính, cho chương trình dịch hữu hiệu chương trình nhận phải thêm thao tác quản lý ngăn xếp chương trình khử đệ quy Vậy tác dụng khử đệ quy chỗ nào? Đương nhiên phủ định số chương trình khử đệ quy ngắn gọn tối ưu không chương trình đệ quy Thêm chương trình khử đệ quy chủ động quản lý tài nguyên máy, ta chủ động đưa thông báo hợp lý chương trình xảy biến cố tràn vùng nhớ Và khử đệ quy cần thiết lập trình với ngôn ngữ không hỗ trợ đệ quy (ví dụ: Assembly, Fortran) Sơ đồ để xây dựng chương trình cho toán khó ta không tìm giải thuật không đệ quy thường là: − Dùng quan niệm đệ quy để tìm giải thuật cho toán; − Mã hóa giải thuật đệ quy; − Khử đệ quy để có chương trình không đệ quy Tuy nhiên việc khử đệ quy dễ nhiều trường hợp ta phải chấp nhận sử dụng chương trình đệ quy 44 3.3 Một số phương pháp khử đệ quy 3.3.1 Khử đệ quy vòng lặp Quy tắc: Chuyển tham số đệ quy thành biến đếm vòng lặp Một yêu cầu đặt cho với toán dùng thủ tục đệ quy, dùng thủ tục lặp thủ tục tối ưu Ta tìm hiểu qua số ví dụ: Ví dụ 1: Tính giai thừa số nguyên dương n, với n đủ lớn Hàm đệ quy Function GiaiThua(n):Item; Begin If (n=1) then GiaiThua := Else Giaithua := n*GiaiThua(n-1); End; Có cách khác tính hàm giai thừa số nguyên từ định nghĩa đệ quy Thay cho việc rút gọn việc tính toán cho giá trị nhỏ hơn, ta xuất phát từ giá trị hàm áp dụng định nghĩa đệ quy để tìm giá trị hàm số nguyên lớn dần Đó thủ tục lặp Procedure GiaiThua(n) Begin gt:=1; for i := to n gt := i * gt; {gt = n!} End; Thông thường để tính dãy giá trị định nghĩa đệ quy, dùng phương pháp lặp số phép tính dùng thuật toán đệ quy (trừ dùng máy đệ quy chuyên dụng) Ta xem xét toán tính số hạng thứ n dãy Fibonacci Hàm đệ quy Function FIBO(n): Item; Begin If (n Thủ tục lặp Procedure Interative FIBO(n); Begin x:=1; y:=1; for i := to n-1 begin z := x + y; x := y; y := z; end; {z số Fibonacci thứ n} End; Ta số phép toán dùng thuật toán đệ quy nhiều dùng phương pháp lặp Tuy nhiên người ta thích dùng thủ tục đệ quy tỏ hiệu so với thủ tục lặp Đặc biệt, có toán giải thủ tục đệ quy mà giải thủ tục lặp 46 3.3.2 Khử đệ quy Stack tự tạo Quy tắc: Chỉ đưa vào stack tham số có ý nghĩa trình đệ quy Phương pháp thường dùng trường hợp dạng đệ quy mà suốt trình thực hàm đệ quy, lời gọi đệ quy thực nhiều lần Khi có lời gọi đệ quy, chương trình tự động Push vào stack toàn biến cục tham số hàm đệ quy Dù ta tiết kiệm đến tối đa chương trình phải sử dụng lượng biến cục định Tuy nhiên, biến cục đôi lúc lại không cần thiết trình đệ quy Trong trường hợp đó, người ta tạo stack riêng push vào stack biến có ý nghĩa trình đệ quy Ngoài ra, việc tự tạo stack riêng có ý nghĩa tạo stack có kích thước lớn từ tăng độ sâu đệ quy Trong đó, stack chương trình tự tạo thường có kích thước hạn chế phương án khử đệ quy (tuy làm lời gọi đệ quy) mà phương án tối ưu sử dụng nhớ để làm tăng độ sâu đệ quy mà Nhìn chung, khử đệ quy stack kỹ thuật khó Cấu trúc stack thành phần biến động tùy theo chương trình đệ quy Thông thường khử đệ quy stack tự tạo đòi hỏi ta phải tiến hành phân tích thật tỉ mỉ chương trình đệ quy Ví dụ: Bài toán tô màu hình kín (Flood Fill) Phát biểu toán: Cho hình kín điểm (x ,y ) nằm bên hình đó, tô màu phần bên hình x Hình 3.3 Mô tả tô màu hình 47 Phân tích toán theo giải thuật đệ quy: Ta giải toán phương pháp tô màu loang Nghĩa từ điểm (x ,y ) ban đầu, ta tô loang điểm kế điểm (x +1,y ), (x -1,y ), (x ,y +1), (x ,y -1) Và từ điểm này, ta lại tiếp tục tô điểm điểm chưa tô màu có màu trùng với màu biên Quá trình tiếp tục lúc không điểm để tô Người ta thường gọi thuật toán thuật toán FloodFill Để đơn giản, ta dùng mảng chiều để minh họa, biên hình có giá trị 1, “màu” tô Mảng chiều ma trận Ví dụ: MaTran[0 9,0 9] = ( (0,1,1,1,1,1,1,0,0,0), 9 (0,1,0,0,0,0,1,0,0,0), (1,1,0,0,0,0,1,1,1,1), (1,0,0,0,0,0,0,0,0,1), (1,0,0,0,0,0,0,1,1,1), (1,0,0,0,0,0,0,1,0,0), (1,0,0,0,0,0,0,1,0,0), (1,0,0,0,0,0,0,1,1,1), (1,0,0,0,0,0,0,0,0,1), (1,1,1,1,1,1,1,1,1,1)) Procedure Fill(x,y: Item;mau: Item); Begin If (MaTran[x,y]Maubien) and(MaTran[x,y]mau) then Begin MaTran[x,y]:=mau; If x0 then Fill(x-1,y,mau); If y0 then Fill(x,y-1,mau); End; 48 End; Bây ta sử dụng stack để khử đệ quy giải toán Trong đoạn chương trình sau, ta tạm thời giả định ta có chương trình sau: − Thủ tục Push(x,y:integer): Cho phép push vào ngăn xếp tọa độ điểm; − Hàm Pop(var x,y:integer): Cho phép lấy tọa độ điểm đầu ngăn xếp; − Hàm IsStackEmpty: Cho biết stack có rỗng không Procedure Fill(x0,y0: Item; mau: Item); Var x,y:integer; Begin Top := -1; Push(x0,y0); While IsStackEmpty = False Begin Pop(x,y); If (MaTran[x,y]Maubien) and(MaTran[x,y]mau) then Begin MaTran[x,y] := mau; If x0 then Push(x-1,y,mau); If y0 then Push(x,y-1,mau); End; End; End; 3.4 Các nhận xét khác đệ quy khử đệ quy 3.4.1 Đệ quy vừa thuật toán vừa công cụ thuật toán Đệ quy loại thuật toán có đặc thù riêng Hơn nữa, máy tính, đệ quy phương tiện, kỹ thuật thể không 49 thể thiếu nhiều thuật toán quan trọng Một số thuật toán theo phương pháp thử - sai 3.4.2 Trong trường hợp giải thuật đệ quy Trong toán phụ thuộc tham số có tính chất sau dùng xây dựng chương trình đệ quy: − Ứng với giá trị đặc biệt tham số toán có thuật toán để giải (trường hợp ta gọi trường hợp suy biến); − Trong trường hợp tổng quát ta quy toán toán hoàn toàn tương tự với giá trị tham số sau số hữu hạn toán dẫn tới trường hợp suy biến Vấn đề cần lưu tâm thiết kế giải thuật đệ quy? Ta thấy câu trả lời qua việc giải đáp câu hỏi sau: − Có thể định nghĩa toán dạng toán loại “nhỏ” nào? − Như kích thước toán giảm lần gọi đệ quy? − Trường hợp đặc biệt toán coi trường hợp suy biến? 3.4.3 Có thể khử đệ quy cho thuật toán đệ quy không Hầu hết phương pháp khử đệ quy áp dụng cho số thuật toán đệ quy trực tiếp, tức thuật toán gọi đệ quy đến Nói chung thuật toán đệ quy trực tiếp tồn lời giải không đệ quy Các thuât toán đệ quy gián tiếp chưa có phương pháp tổng quát để khử đệ quy 3.4.4 Sự tương đương chương trình đệ quy khử đệ quy Với phương pháp khử đệ quy nêu ta thấy thuật toán khử đệ quy hoàn toàn tương đương với dạng đệ quy chúng Ở tương đương so sánh phương diện kết đầu thời gian tính toán thuật toán Về thực chất chương trình khử đệ quy 50 làm thay đổi số phần việc chương trình dịch tổ chức lưu trữ liệu ngăn xếp 3.4.5 Đệ quy hay không đệ quy Có nhiều quan điểm cho giải toán theo kiểu đệ quy lười biếng, ỷ lại vào sức mạnh tính toán máy tính Quan điểm cho rằng, để giải toán cách nghiêm túc, cần phải hiểu rõ trình giải toán Nhưng với thuật toán đệ quy, trình giải toán trình “ẩn” khó hình dung (tuy nguyên tắc, ta có phương pháp để theo dõi nó) Tuy nhiên, có nhiều toán mà từ đầu ta tìm kiếm thuật toán không đệ quy khó “suy nghĩ” theo kiểu đệ quy ta có lời giải đơn giản Từ đó, ta tìm thấy thuật toán xác cho toán Một trường hợp điển hình toán tháp Hà Nội Nhưng ta phải khẳng định chương trình đệ quy lại không đơn giản thuật toán đệ quy Nếu thuật giải đệ quy có dạng khử đệ quy nên chọn thuật giải nào? Để trả lời câu hỏi ta cần trả lời số câu hỏi sau: − Tốc độ thực thi có quan trọng hay không? Thường dạng khử đệ quy có tốc độ thực nhanh dạng đệ quy chúng, sử dụng tối ưu ngăn xếp, loại thao tác thừa ngăn xếp thời gian trở từ chương trình đệ quy; − Ta muốn diễn tả thuật toán hay muốn viết chương trình để giải toán đó? Thường dạng đệ quy viết đơn giản, ngắn gọn, sáng sủa nhiều so với dạng khử đệ quy chúng, có lợi việc trình bày toán có tính chất đệ quy; − Kích thước chương trình có quan trọng không? Về mặt kích thước chương trình chương trình đệ quy thường có kích thước nhỏ so với dạng khử đệ quy chúng; − Bạn có muốn kiểm soát trường hợp tràn vùng nhớ chương trình hay không? Với chương trình khử đệ quy ta hoàn toàn 51 kiểm soát tài nguyên vùng nhớ, ta đưa thông báo hợp lý tài nguyên vùng nhớ bị cạn kiệt; − Ngôn ngữ lập trình cài đặt thuật toán có hỗ trợ đệ quy không? 52 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI 53 TÀI LIỆU THAM KHẢO [1] - Phạm Xuân Bách, Cung định nghĩa đệ quy quy tắc cách vẽ, Tin học nhà trường số 6(45), trang 20, Hà Nội 2005 [2] - Trương Hà Hải, Bài giảng lý thuyết thuật toán, Khoa Công nghệ thông tin - Đại học Thái Nguyên, Thái Nguyên, tháng năm 2008 [3] - Hoàng Kiếm, Giải toán máy tính nào?(tập 1), Nhà xuất giáo dục, 2005 [4] - Đỗ Xuân Lôi, Cấu trúc liệu giải thuật, Nhà xuất Đại học Quốc gia Hà Nội, 2006 [5] - Nguyễn Xuân My (Chủ biên), Hồ Sĩ Đàm, Trần Đỗ Hùng, Lê Sĩ Quang, Một số vấn đề chọn lọc môn tin học tập 1, Nhà xuất Giáo Dục, 2002 [6] - Nguyễn Đức Nghĩa, Nguyễn Tô Thành, Toán rời rạc, Nhà xuất Đại học Quốc gia Hà Nội, Hà Nội, 2006 http://fractal.org/ http://mathworld.wolfram.com/Fractal.html http://tusach.thuvienkhoahoc.com/wiki/Giới_thiệu_về_hình_học_Fractal http://vi.wikipedia.org/wiki/Phân_dạng 54

Ngày đăng: 01/11/2016, 22:22

Xem thêm: Tài liệu về đệ quy và đệ quy nâng cao

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w