Bài giảng Phân tích thiết kế giải thuật và cấu trúc dữ liệu: Phần 1 - ĐH CNTT&TT

56 31 0
Bài giảng Phân tích thiết kế giải thuật và cấu trúc dữ liệu: Phần 1 - ĐH CNTT&TT

Đ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

Bài giảng Phân tích thiết kế giải thuật và cấu trúc dữ liệu gồm có 6 chương và được chia thành 2 phần. Phần 1 sau đây gồm 3 chương đầu, trong đó chương 1 đi tìm hiểu các cấu trúc dữ liệu cơ bản, chương 2 tác giả đi sâu tìm hiểu các thuật toán kinh điển nhằm giúp người đọc nắm được ý nghĩa của thuật toán; chương 3 là tìm hiểu về đệ quy và giải thuật đệ quy. Mời các bạn cùng tham khảo.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA HỆ THỐNG THÔNG TIN KINH TẾ NGUYỄN VĂN HUÂN VŨ XUÂN NAM NGUYỄN VĂN GIÁP ĐỖ VĂN ĐẠI BÀI GIẢNG PHÂN TÍCH THIẾT KẾ GIẢI THUẬT VÀ CẤU TRÚC DỮ LIỆU NGÀNH HỆ THỐNG THÔNG TIN QUẢN LÝ THÁI NGUYÊN, NĂM 2012 MỤC LỤC MỤC LỤC Chương 1: CẤU TRÚC DỮ LIỆU CƠ BẢN 1.1 Mảng .6 1.1.1 Khái niệm .6 1.1.2 Mảng chiều 1.1.3 Mảng hai chiều 1.2 Biến động trỏ 1.2.1 Biến động .7 1.2.2 Con trỏ 1.2.3 Sử dụng trỏ .9 1.3 Danh sách (LIST) 13 1.3.1 Khái niệm .13 1.3.2 Danh sách cài đặt mảng 15 1.3.3 Danh sách liên kết .19 1.3.4 Ngăn xếp (stack) 26 1.3.5 Hàng đợi (Queue) 35 Chương 2: THUẬT TOÁN 39 2.1 Thuật toán 39 2.1.1 Khái niệm .39 2.1.2 Yêu cầu 40 2.1.3 Đánh giá thuật toán 41 2.2 Một số thuật toán đơn giản 44 2.2.1 Tìm Ước chung lớn số tự nhiên 44 2.2.2 Kiểm tra số tự nhiên có phải số nguyên tố không .45 Chương 3: ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QUY 46 3.1 Khái niệm đệ quy .46 3.2 Giải thuật đệ quy 46 3.3 Một số ứng dụng giải thuật đệ quy 48 3.3.1 Hàm n! 48 3.3.2 Bài toán dãy số FIBONACCI 49 3.3.3 Tìm ước số chung lớn hai số nguyên dương a va b 50 3.3.4 Bài toán “Tháp Hà Nội” 51 3.3.5 Bài toán quân hậu giải thuật đệ qui quay lui 53 Chương 4: CÁC THUẬT TOÁN SẮP XẾP 57 4.1 Các thuật toán xếp 57 4.1.1 Sắp xếp chọn (Selection Sort) 57 4.1.2 Sắp xếp chèn (Insert Sort) 59 4.1.3 Sắp xếp bọt (Bubble Sort) 61 4.2 Sắp xếp nhanh (Quick Sort) 63 4.2.1 Tư tưởng 63 4.2.2 Giải thuật 63 4.3 Sắp xếp (Merge Sort) 68 4.3.1 Tư tưởng 68 4.3.2 Giải thuật 69 Chương 5: CÂY 72 5.1 Các khái niệm 72 5.1.1 Cha, con, đường 73 5.1.2 Cây 74 5.1.3 Độ cao, mức 74 5.1.4 Cây 74 5.2 Các phép toán .75 5.3 Duyệt Cây 76 5.4 Cây nhị phân 82 5.4.1 Định nghĩa 82 5.4.2 Mô tả 83 5.4.3 Cây tìm kiếm nhị phân 84 Chương 6: TÌM KIẾM 86 6.1 Tìm kiếm 86 6.2 Tìm kiếm nhị phân .88 6.3 Tìm kiếm nhị phân 90 6.3.1 Giải thuật đệ qui 90 6.3.2 Giải thuật lặp 90 LỜI NĨI ĐẦU Phân tích – thiết kế giải thuật Cấu trúc liệu môn học sinh viên Công nghệ thông tin nói chung ngành Hệ thống thơng tin Kinh tế nói riêng Các cấu trúc liệu giải thuật xem yếu tố quan trọng lập trình, câu nói tiếng Niklaus Wirth: Chương trình = Cấu trúc liệu + Giải thuật (Programs = Data Structures + Algorithms) Nắm vững cấu trúc liệu giải thuật sở để sinh viên tiếp cận với việc thiết kế xây dựng phần mềm sử dụng cơng cụ lập trình đại Cấu trúc liệu xem phương pháp lưu trữ liệu máy tính nhằm sử dụng cách có hiệu liệu Và để sử dụng liệu cách hiệu cần phải có thuật tốn áp dụng liệu Do vậy, cấu trúc liệu phân tích – thiết kế giải thuật yếu tố khơng thể tách rời có liên quan chặt chẽ với Việc lựa chọn cấu trúc liệu ảnh hưởng lớn tới việc lựa chọn áp dụng giải thuật Giáo trình gồm sáu chương: Chương tìm hiểu cấu trúc liệu bản; Chương tác giả sâu tìm hiểu thuật tốn kinh điển nhằm giúp người đọc nắm ý nghĩa thuật tốn; Chương 3, 4, 5, sâu tìm hiểu cách tổ chức liệu thuật toán kiểu liệu Với mục đích cung cấp cho em sinh viên nhìn tồn thể Tác giả kỳ vọng kết thúc môn học người học nắm cách tổ chức cấu trúc liệu Từ áp dụng phần kiến thức vào nghiên cứu mảng khác hiệu quả, tối ưu Mặc dù cố gắng biên soạn, song giáo trình khơng tránh khỏi thiếu sót Rất mong nhận ý kiến đóng góp từ phía người đọc Trân trọng cảm ơn! Thái Nguyên, tháng 08 năm 2011 Biên soạn Bộ môn Thương mại điện tử Chương CẤU TRÚC DỮ LIỆU CƠ BẢN 1.1 Mảng 1.1.1 Khái niệm Mảng dãy có thứ tự (về mặt vị trí) phần tử với đặc điểm sau: - Số lượng phần tử cố định - Mọi phần tử có kiểu liệu (dữ liệu sở mảng ) Các đặc trưng : + Cho phép truy cập ngẫu nhiên đến phần tử Thời gian truy cập đến phần tử + Số lượng phần tử mảng cố định Việc bổ sung loại bỏ phần tử khó khăn (mất thời gian) Các phép tốn : Tạo mảng, duyệt mảng, tìm kiếm, xếp, trộn mảng, tách mảng … 1.1.2 Mảng chiều Cấu trúc lưu trữ: Các phần tử bố trí sát nhớ theo thứ tự tăng dần số nên dễ dàng tìm địa phần tử biết số: Loc(a[i]) = a0 + (i-1) * l a0 địa phần tử thứ ; l độ dài ô nhớ (byte) 1.1.3 Mảng hai chiều Cấu trúc lưu trữ: Có hai phương pháp lưu trữ + Phương pháp lưu trữ ưu tiên hàng Với mảng Anm (n hàng m cột) Loc(aij ) = L0 + (i-1)*m + (j-1) + Phương pháp lưu trữ ưu tiên cột Với mảng Anm (n hàng m cột) Loc(aij ) = L0 + (j-1)*n + (i-1) 1.2 Biến động trỏ 1.2.1 Biến động Tất biến có kiểu cấu trúc liệu mà ta nghiên cứu Array, Record, Set gọi biến tĩnh chúng xác định cách rõ ràng khai báo, sau chúng dùng thông qua tên Thời gian tồn biến tĩnh thời gian tồn khối chương trình có chứa khai báo biến Chẳng hạn, biến tĩnh khai báo chương trình (biến tồn cục) tồn từ chương trình thực kết thúc chương trình, cịn biến tĩnh khai báo chương trình (biến địa phương) tồn từ chương trình thực kết thúc chương trình Ngồi biến tĩnh xác định trước, người ta cịn tạo biến lúc chạy chương trình, tuỳ theo nhu cầu Việc tạo biến theo kiểu gọi cấp pháp nhớ động, biến tạo gọi biến động Các biến động tên Để tạo biến động, người ta sử dụng kiểu biến đặc biệt, gọi trỏ thủ tục cấp phát nhớ động (NEW) thông qua trỏ Khi không sử dụng biến động nữa, người ta xố khỏi nhớ, việc gọi thu hồi nhớ động Để thu hồi nhớ dành cho biến động, người ta dùng thủ tục DISPOSE thông qua trỏ sử dụng để tạo biến động So với biến tĩnh, việc sử dụng biến động có ưu điểm tiết kiệm nhớ Bởi vì, cần dùng biến động người ta tạo khơng cần người ta lại xố Còn biến tĩnh, chúng xác định cấp phát nhớ biên dịch, chúng chiếm giữ nhớ suốt thời gian chương trình làm việc Chẳng hạn, cần sử dụng mảng ta phải khai báo phần đầu chương trình, lúc ta phải xác định kích thước mảng thường khai báo dôi gây lãng phí nhớ 1.2.2 Con trỏ 1.2.2.1 Kiểu trỏ Kiểu trỏ một kiểu liệu đặc biệt để biểu diễn địa đối tượng (biến, mảng, ghi ) nhớ Có kiểu đối tượng có nhiêu kiểu trỏ tương ứng Các giá trị thuộc kiểu trỏ địa (vị trí) nhớ máy tính để lưu giữ đối tượng thuộc kiểu đối tượng Ví dụ, kiểu trỏ nguyên dùng để biểu thị địa biến nguyên, giá trị thuộc kiểu trỏ nguyên địa nhớ để lưu trữ số nguyên, kiểu trỏ ghi dùng để biểu thị địa ghi, giá trị thuộc kiểu trỏ ghi địa nhớ để lưu trữ ghi v.v Để định nghĩa kiểu trỏ ta dùng mẫu sau: TYPE Kiểu_con_trỏ = ^Kiểu_đối_tượng ; Ví dụ 1: TYPE Tro_nguyen = ^Integer ; Tro_hoc_sinh = ^Hoc_sinh; Hoc_sinh = Record Ho_ten : String[25]; tuoi : Integer; End; Chú ý: Khi định nghĩa kiểu trỏ ghi tiến hành theo hai cách sau: + Cách 1: Định nghĩa kiểu ghi trước, dùng định nghĩa kiểu trỏ ghi tương ứng + Cách 2: (xem ví dụ trên) Định nghĩa kiểu trỏ ghi thông qua kiểu ghi chưa định nghĩa Nhưng sau phải định nghĩa kiểu ghi 1.2.2.2 Biến trỏ Biến trỏ biến dùng để chứa địa biến động nhớ Có thể khai báo biến trỏ thông qua kiểu trỏ định nghĩa trước khai báo cách trực tiếp Ví dụ 2: Var pn1, pn2 : Tro_nguyen; phs : Tro_hoc_sinh; pt1, pt2 : ^real; Trong ví dụ khai báo biến trỏ (hay gọi trỏ), đó: pn1, pn2 trỏ kiểu nguyên phs trỏ kiểu Hoc_sinh (bản ghi) pt trỏ kiểu thực 1.2.3 Sử dụng trỏ Để thâm nhập vào biến động có địa nằm biến trỏ, chẳng hạn trỏ Ptr ta dùng ký hiệu Ptr^ Ví dụ: thơng qua trỏ pn1 ta có biến động pn1^, thơng qua trỏ phs ta có biến động phs^ Cũng giống biến tĩnh, biến động tạo để chứa liệu Do đó, câu lệnh viết hợp lệ pn1^ := 10; {gán giá trị 10 cho biến động} readln(pn2^); {nhập liệu vào biến động pn2^ từ bàn phím} Readln(phs^.ho_ten); {Nhập họ tên cho học sinh từ bàn phím vào trường Ho_ten biến động phs^} phs^.tuoi := 16; {gán giá trị 16 cho trường tuoi biến động phs^} a Các thao tác với trỏ + Phép gán hai trỏ kiểu Ví dụ: pn1 := pn2; + Phép so sánh hai trỏ kiểu gồm: so sánh = (bằng nhau) phép sánh (khác nhau) b Hằng trỏ NULL NULL trỏ đặc biệt dành cho biến trỏ, dùng để báo trỏ khơng trỏ vào đâu Hằng NULL đem gán cho biến trỏ Đương nhiên việc thâm nhập vào biến động thơng qua trỏ có giá trị NULL vô nghĩa Thực chất NULL trỏ đặc biệt chứa giá trị c Tạo lập giải phóng biến động Trong ngôn ngữ pascal, thủ tục chuẩn NEW dùng để tạo biến động, với tham số biến trỏ, trỏ tới biến động mà ta muốn lập Cách viết: NEW(Biến_con_trỏ); Ví dụ: để tạo biến động phs^ trỏ phs trỏ tới, ta viết: NEW(phs); Như NEW(phs) xếp nhớ cho biến động có kiểu Hoc_sinh Trong chương trình ta dùng thủ tục NEW(phs) nhiều lần, lần tạo biến động phs^, song trỏ phs trỏ vào biến động tạo lần cuối Ví dụ: Nếu chương trình ta viết lần sau: NEW(phs); phs^.Ho_ten := ‘Mot’; phs^.tuoi := 1; NEW(phs); phs^.Ho_ten := ‘Hai’; phs^.tuoi := 2; 10 toán khác Trong trường hợp ta cần dựa tiêu chuẩn (2) Ta cài đặt thuật tốn phức tạp, miễn chương trình nhận chạy nhanh chương trình khác Tiêu chuẩn (2) xem tính hiệu thuật tốn Tính hiệu thuật toán bao gồm hai nhân tố Dung lượng không gian nhớ cần thiết để lưu giữ liệu vào, kết tính tốn trung gian kết thuật toán Thời gian cần thiết để thực thuật toán (ta gọi thời gian chạy) Chúng ta quan tâm đến thời gian thực thuật tốn Vì vậy, nói đến đánh giá độ phức tạp thuật tốn, có nghĩa ta nói đến đánh gia thời gian thực Một thuật tốn có hiệu xem thuật tốn có thời gian chạy thuật tốn khác Ký hiệu lớn đánh giá thời gian thực thuật toán ký hiệu ô lớn Khi đánh giá thời gian thực phương pháp toán học, bỏ qua nhân tố phụ thuộc vào cách cài đặt tập trung vào xác định độ lớn thời gian thực T(n) Ký hiệu tốn học lớn sử dụng để mô tả độ lớn hàm T(n) Giả sử n số nguyên không âm, T(n) f(n) hàm thực không âm Ta viết T(n) = 0(f(n)) (đọc: T(n) ô lớn f(n)), tồn số dương c no cho T(n)  c f(n), với n  no Nếu thuật tốn có thời gian thực T(n) = 0(f(n)), nói thuật tốn có thời gian thực cấp f(n) Từ định nghĩa ký hiệu lớn, ta xem hàm f(n) cận T(n) Ví dụ : Giả sử T(n) = 3n2 + 5n + Ta có 3n2 + 5n + 0, cỡ liệu vào n Các lệnh (1) (6) có thời gian thực 0(1) Vì thời gian thực thuật tốn thời gian thực lệnh while ta đánh giá thời gian thực lệnh while (2) Thân lệnh này, khối gồm ba lệnh (3), (4) (5) Mỗi lệnh có thời gian thực 0(1), khối có thời gian thực 0(1) Cịn phải đánh giá số lớn lần thực lặp khối Ta có : m = n.q1 + r1 ,  r1 < n n = r1q2 + r2 ,  r2 < r1 Nếu r1  n/2 r2 < r1  n/2, r2 < n/2 Nếu r1 > n/2 q2 = 1, tức n = r1 + r2 , r2 < n/2 Tóm lại, ta ln có r2 < n/2 Như vậy, hai lần thực khối phần dư r giảm nửa n Gọi k số nguyên lớn cho 2k  n Số lần lặp khối tối đa 2k+12log2n+1 Do thời gian thực lệnh while 0(log2n) Đó thời gian thực thuật toán 2.2.2 Kiểm tra số tự nhiên có phải số nguyên tố khơng Thuật tốn kiểm tra số ngun n (n > 2) có số ngun tố hay khơng function var begin NGTO (n : integer) : boolean ; a : integer ; NGTO : = true ; a:=2; while a 0 N! = n(n-1)! Ví dụ : Cấu trúc thư mục dạng định nghĩa đệ qui : thư mục chứa thư mục 3.2 Giải thuật đệ quy Nếu lời giải toán T thực thơng qua lời giải tốn T’ có kích thước nhỏ T có dạng giống T, lời giải đệ qui Giải thuật tương ứng với lời giải gọi giải thuật đệ qui Ở T1 có dạng giống T theo nghĩa T1 phải “nhỏ” T Trong thủ tục có lời gọi đến gọi thủ tục đệ qui Chẳng hạn với tốn tính n! n! tốn T cịn (n-1)! tốn T1 ta thấy T1 dạng với T nhỏ (n-1 < n) Xét tốn tìm từ từ điển Có thể nêu giải thuật sau: If từ điển trang then 46 tìm từ trang 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 then tìm từ nửa trước else tìm từ nửa sau end; Giải thuật gọi giải thuật đệ quy Việc tìm từ từ điển được giải tốn nhỏ việc tìm từ nửa thích hợp từ điển Ta thấy có hai điểm cần lưu ý: a) Sau lần từ điển tách làm đôi nửa thích hợp lại tìm chiến thuật dùng trước (nửa lại tách đơi) b) Có trường hợp đặc biệt, sau nhiều lần tách đơi từ điển cịn trang Khi việc tách đơi ngừng lại toán trở thành đủ nhỏ để ta tìm từ mong muốn cách tìm Trường hợp gọi trường hợp suy biến * Cấu trúc chung thủ tục đệ quy Một thủ tục đệ qui gồm có hai phần Phần cố định: gía trị khởi đầu cho hàm, thủ tục đệ qui Phần hạ bậc:(phần đệ qui): Tác động hàm đệ qui thực thông qua tác động hay giá trị định nghĩa trước Thủ tục gọi thủ thục đệ quy Nó có đặc điểm sau: 47 a) Trong thủ tục đệ quy có lời gọi đến thủ tục Ở thủ tục SEARCH có lời gọi call SEARCH (lời gọi gọi lời gọi đệ quy) b) Sau lần có lời gọi đệ quy kích thước tốn thu nhỏ trước Ở có lời gọi call SEARCH kích từ điển cịn nửa so với trước c) Có trường hợp đặc biệt, trường hợp suy biến lời gọi call SEARCH với từ điển dict trang Khi trường hợp xảy tốn cịn lại giải theo cách khác hẳn (tìm từ word trang cách tìm kiếm tuần tự) việc gọi đệ quy kết thúc Chính tình trạng kích thước tốn giảm dần sau lần gọi đệ quy đảm bảo dẫn tới trường hợp suy biến Một số ngôn ngữ cấp cao như: Pascal, C, Algol v.v cho phép viết thủ tục đệ quy Nếu thủ tục đệ quy chứa lời gọi đến gọi đệ quy trực tiếp Cũng có trường hợp thủ chứa lời gọi đến thủ tục khác mà thủ tục lại chứa lời gọi đến Trường hợp gọi đệ quy gián tiếp 3.3 Một số ứng dụng giải thuật đệ quy Khi toán xét liệu xử lý định nghĩa dạng đệ quy việc thiết kế giải thuật đệ quy tỏ thuận lợi Hầu phản ánh sát nội dung định nghĩa Ta xét số tốn sau: 3.3.1 Hàm n! Hàm định nghĩa sau: nÕu n  1 Factorial (n)   n * Factorial(n - 1) nÕu n  Giải thuật đệ quy viết dạng hàm đây: Function Factorial(n) Begin if n=0 then Factorial:=1 48 else Factorial := n*Factorial(n-1); End; Trong hàm lời gọi đến nằm câu lệnh gán sau else Mỗi lần gọi đệ quy đến Factorial, giá trị n giảm Ví du, Factorial(4) gọi đến Factorial(3), gọi đến Factorial(2), gọi đến Factorial(1), gọi đến Factorial(0) trường hợp suy biến, tính theo cách đặc biệt Factorial(0) = 3.3.2 Bài toán dãy số FIBONACCI Dãy số Fibonacci bắt nguồn từ toán cổ việc sinh sản cặp thỏ Bài toán đặt sau: - Các thỏ không chết - Hai tháng sau đời cặp thỏ sinh cặp thỏ - Khi sinh tháng chúng lại sinh cặp Giả sử cặp thỏ đời đến tháng thứ n có cặp? Ví dụ với n = 6, ta thấy Tháng thứ 1: cặp (cặp ban đầu) Tháng thứ 2: cặp (cặp ban đầu vẵn chưa đẻ) Tháng thứ 3: cặp (đã có thêm cặp con) Tháng thứ 4: cặp (cặp đầu đẻ thêm) Tháng thứ 5: cặp (cặp bắt đầu đẻ) Tháng thứ 6: cặp (cặp đẻ tiếp) Đặt F(n) số cặp thỏ tháng thứ n Ta thấy cặp thỏ có tháng thứ n-2 sinh tháng thứ n số cặp thỏ tháng thứ n là: F(n) = f(n-2) + F(n-1) F(n) tính sau: nÕu n  1 F (n)   F(n - 2)  F(n - 1) nÕu n  49 Dãy số thể F(n) ứng với giá trị n = 1, 2, 3, , có dạng 1 13 21 34 55 gọi dãy số Fibonacci Nó mơ hình nhiều tượng tự nhiên sử dụng nhiều tin học Sau thủ tục đệ quy thể giải thuật tính F(n) Function F(n) Begin if n2) coi n-1 đĩa trên, đóng vai trị đĩa thứ xử lý giống trường hợp đĩa được, nghĩa là: - Chuyển n-1 đĩa từ A sang B  Chuyển đĩa thứ n từ A sang C  Chuyển n-1 đĩa từ B sang C Lược đồ thể bước sau: A B C A B C A B C A B C Bước Bước Bước 52 Như vậy, toán “Tháp Hà Nội” tổng quát với n đĩa dẫn đến tốn tương tự với kích thước nhỏ hơn, chẳng hạn từ chỗ chuyển n đĩa từ cọc A sang cọc C chuyển n-1 đĩa từ cọc A sang cọc B mức giải thuật lại là: - Chuyển n-2 đĩa từ cọc A sang cọc C - Chuyển đĩa tử cọc A sang cọc B - Chuyển n-2 đĩa từ cọc B sang cọc C trường hợp suy biến xảy ra, trường hợp ứng với toán chuyển đĩa Vậy đặc điểm đệ quy giải thuật xác định ta có thểviết giải thuật đệ quy tốn “Tháp Hà Nơị” sau: Procedure Chuyen(n, A, B, C) Begin if n=1 then chuyển đĩa từ A sang C else begin call Chuyen(n-1, a, C, B); call Chuyen(1, A, B, C); call Chuyen(n-1, B, A, C) ; end; End; 3.3.5 Bài toán quân hậu giải thuật đệ qui quay lui Cho bàn cờ vua 8x8 Hãy xếp hậu lên bàn cờ cho không khống chế Hai hậu khống chế chúng hàng, cột đường chéo Phân tích tốn: Vị trí qn hậu xác định qua số thứ tự dòng cột Do ta coi hậu thứ i hàng i cột x[i] Vậy nghiệm tốn có 53 thể coi vector x gồm thành phần với ý nghĩa: Con hậu thứ i đặt hàng i cột x[i] x[i] lấy giá trị tập {1,2…n} Ràng buộc: giá trị x[i] khác đơi khơng có hậu đường chéo Dùng thêm mảng đánh dấu để mô tả đường chéo phụ có hậu khống chế Tức ta đặc hậu i vị trí (i,j), ta đánh dấu đường chéo i-j đường chéo phụ i+j Như cấu trúc liệu, ta dùng mảng: Mảng x với ý nghĩa: x[i] cột ta đặt hậu thứ i Mảng cot với ý nghĩa: cot[j]=1 cột j có hậu đặt, ngược lại cot[j]=0 Mảng dcc với ý nghĩa: dcc[k]=1 đường chéo thứ k có hậu đặt, tức ta đặt hậu j=k; ngược lại dcc[k]=0 Tương tự ta dùng mảng dcp với ý nghĩa: dcp[k]=1 đường chéo phụ thứ k có hậu đặt Giả mã thuật toán xếp hậu sau: procedure Try(i); var j; begin for j := to n if (cot[j]=0) and (dcc[i-j]=0) and (dcp[i+j]=0) then begin x[i] := j; cot[j]:=1; dcc[i-j]:=1; dcp[i+j]:=1;{ghi nhận trạng thái mới} 54 if i=n then Update else Try(i+1); cot[j]:=0; dcc[i-j]:=0; dcp[i+j]:=0; {phục hồi trạng thái cũ} end; end; procedure Update; begin count := count + 1; print(x); end; * Khử đệ quy Khi thay giải thuật đệ qui giải thuật không đệ qui, ta gọi khử đệ qui Ví dụ 1: n! Function gt(n:integer):integer; Var tg,i:integer; Begin tg:=1; If ((n=0) or (n=1) then gt:=1 Else Begin 55 For i:=1 to n tg:=tg*i; gt:=tg; End; End; Ví dụ 2: Fibonacci Function Fibo (n:byte):double; Begin If n

Ngày đăng: 09/05/2021, 14:33

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan