Bài giảng Tin học đại cương - Bài 5: Một số thuật toán thông dụng cung cấp cho người học các kiến thức: Các cấu trúc cơ bản trong lập trình, giả mã (pseudocode), thuật toán số học, thuật toán về dãy, thuật toán đệ quy. Mời các bạn cùng tham khảo.
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài Một số thuật tốn thơng dụng Đỗ Bá Lâm lamdb@soict.hut.edu.vn Nội dung 5.1 Các cấu trúc lập trình 5.2 Giả mã (pseudocode) 5.3 Thuật tốn số học 5.4 Thuật toán dãy 5.5 Thuật toán đệ quy 5.1 Các cấu trúc lập trình • Cấu trúc • Cấu trúc rẽ nhánh • Cấu trúc lặp 5.1.1 Cấu trúc • Các bước thực theo trình tự tuyến tính, hết bước đến bước khác Bước Bước … Bước n 5.1.2 Cấu trúc rẽ nhánh • • Việc thực bước phụ thuộc vào điều kiện xác định Ví dụ: Tìm max số a, b – Nếu a > b max a, ngược lại max b – Diễn giải: • • • • B1: B2: B3: B4: Nhập số a, b Nếu a > b Max = a đến bước kết thúc (B4) (a b Max a Max b 5.1.3 Cấu trúc lặp • • • Một thao tác/ cơng việc thực lặp nhiều lần Lặp lại chừng điều kiệu lặp Số lần lặp biết trước khơng biết trước.Tuy nhiên số lần lặp phải hữu hạn S Điều kiện Đ Thực cơng việc vịng lặp Thực cơng việc khỏi vịng lặp 5.1.3 Cấu trúc lặp (2) Ví dụ: Tìm số lớn dãy có n số ◼ ◼ ◼ Lần lượt phải so sánh số Max tạm thời (lúc đầu Max gán phần tử thứ nhất, a1) với ai, với i từ 2, 3,…, n Việc so sánh thực lặp nhiều lần Max Khi kết thúc trình lặp, ta thu Max số lớn dãy n số Nhập N dãy số a1, a2,…,aN Max a1; i=2 i>N Đ Hiển thị “Max số lớn nhất” Đ Max S > Max S ii+1 Nội dung 5.1 Các cấu trúc lập trình 5.2 Giả mã (pseudocode) 5.3 Thuật toán số học 5.4 Thuật toán dãy 5.5 Thuật toán đệ quy 5.2 Mã giả (pseudocode) • Gán: ; := –ii+1 – a := b + c • Cấu trúc chọn if(điều kiện) then (hành động) if(điều kiện) then (hành động) else (hành động) • Cấu trúc nhảy goto: – goto nhãn x; 5.2 Giả mã (2) • Cấu trúc lặp: while điều_kiện hành_động repeat hành_động until điều_kiện for biến:= gtrị_đầu to gtrị_cuối hành_động for biến:= gtrị_đầu downto gtrị_cuối hành_động 10 Bài toán USCLN, BSCNN • Cho hai số ngun a, b Tìm USCLN, BSCNN hai số này? – Input: a, b nguyên – Output: USCLN, BSCNN • Ý tưởng? – a = |a|, b =|b| – a=0 && b=0 => khơng có USCLN – a=0 || b=0 => USCLN số khác cịn lại – Ngược lại • Trừ dần chừng a!=b => a=a-b b=b-a; • Ơclit: c=a%b Chừng c!=0=> a=b; b=c; 15 Bài toán USCLN, BSCNN Nhập a, b a : = |a|; b: = |b|; if(a=0 and b=0) then begin Xuất: khơng có USCLN Dừng thuật tốn end else if (a=0 or b=0) then begin Xuất: USCLN a+b Dừng thuật toán; end while (a !=b) begin if (a>b) a = a-b; else b = b-a; end Xuất: a USCLN 16 Bài tập • Bài tốn: Giải phương trình bậc II – Đầu vào: Ba hệ số a, b, c – Đầu ra: Nghiệm phương trình ax2 + bx + c = • Ý tưởng: – Lần lượt xét a = 0, b = xét c=0 để xét trường hợp phương trình 17 Bài tập • Bài tốn: Nhập vào ba số nguyên dương a, b, c Cho biết có phải cạnh tam giác vng hay không? – Đầu vào: ba số a, b, c – Đầu ra: Kết luận tam giác vuông hay không • Ý tưởng: – Đìều kiện tam giác vng • Điều kiện vng: tổng bình phương cạnh = bình phương cạnh lại 18 Nội dung 5.1 Các cấu trúc lập trình 5.2 Giả mã (pseudocode) 5.3 Thuật toán số học 5.4 Thuật toán dãy 5.5 Thuật toán đệ quy 19 5.4 Thuật toán dãy • Làm việc với dãy số • Các tốn điển hình – Tìm số lớn nhất, nhỏ dãy – Kiểm tra dãy có phải dãy tăng dãy giảm – Sắp xếp dãy tăng dần giảm dần – Tìm dãy có phần tử giá trị cho trước – Tính trung bình cộng dãy –… 20 Ví dụ - Tìm số lớn dãy • Input: dãy số a1, a2, a3,… an • Output: max giá trị lớn dãy số cho • Thuật tốn: max:=a1; for i:=2 to n if max < then max:= Xuất: max giá trị lớn dãy số 21 Bài tập • Bài Xây dựng thuật tốn tìm phần tử có giá trị truyệt đối lớn dãy gồm n phần tử • Bài Xây dựng thuật tốn tìm tổng số chẵn tổng số lẻ dãy gồm n phần tử nhập vào từ bàn phím • Bài Xây dựng thuật toán kiểm tra xem dãy số gồm n phần tử nhập vào từ bàn phím có phải dãy số tăng (hoặc giảm) khơng • Bài Xây dựng thuật tốn tính trung bình cộng số dương dãy gồm n số nhập vào từ bàn phím 22 Nội dung 5.1 Các cấu trúc lập trình 5.2 Giả mã (pseudocode) 5.3 Thuật toán số học 5.4 Thuật toán dãy 5.5 Thuật toán đệ quy 23 5.5 Thuật tốn đệ quy • Với tốn phân tích đưa tới việc giải toán loại cấp độ thấp – độ lớn liệu nhập nhỏ – giá trị cần tính tốn nhỏ → Tự thực lại thuật tốn • Ví dụ: – Giai thừa: n! = (n-1)! * n – Dãy số Fibonacci: 0, 1, 1, 2, 3, 5, • F(n) = F(n-1) + F(n-2) 24 5.5 Thuật tốn đệ quy (2) • Để xây dựng thuật toán đệ quy, cần xác định: – Trường hợp bản: (Các) trường hợp không cần thực lại thuật tốn – Phần tổng qt: Có u cầu gọi đệ quy • Cần xác định nguyên lý đưa trường hợp tổng quát trường hợp • Đảm bảo tính dừng giải thuật đệ quy - chắn từ trường hợp tổng quát đến trường hợp 25 Ví dụ • Tính giai thừa n: – Trường hợp bản: 0! = – Trường hợp tổng quát: n! = (n-1)! * n • Xây dựng dãy Fibonacci – Trường hợp bản: F(0) = 0; F(1) = – Trường hợp tổng quát: F(n) = F(n-1) + F(n-2) 26 Tính giai thừa - Thuật tốn đệ quy • Input: số tự nhiên n • Output: GT(n)=n! • Thuật giải: Nhập n if(n=0) then GT:=1; else GT := GT(n-1)*n; Xuất GT 27 Bài tập • Xây dựng thuật tốn cho tốn tìm số Fibonacci F(n) 28 Thuật giải heuristic • Dùng “mẹo” • Áp dụng với tốn – Chưa tìm thuật tốn khơng biết có tồn thuật tốn khơng – Có thuật tốn thời gian tính tốn q lâu điều kiện thuật tốn khó đáp ứng 29 ... hành_động 10 Nội dung 5. 1 Các cấu trúc lập trình 5. 2 Giả mã (pseudocode) 5. 3 Thuật toán số học 5. 4 Thuật toán dãy 5. 5 Thuật toán đệ quy 11 5. 3 Thuật toán số học • Các tốn số học – Xác định số nguyên... dung 5. 1 Các cấu trúc lập trình 5. 2 Giả mã (pseudocode) 5. 3 Thuật tốn số học 5. 4 Thuật toán dãy 5. 5 Thuật toán đệ quy 5. 1 Các cấu trúc lập trình • Cấu trúc • Cấu trúc rẽ nhánh • Cấu trúc lặp 5. 1.1... nhất” Đ Max S > Max S ii+1 Nội dung 5. 1 Các cấu trúc lập trình 5. 2 Giả mã (pseudocode) 5. 3 Thuật toán số học 5. 4 Thuật toán dãy 5. 5 Thuật toán đệ quy 5. 2 Mã giả (pseudocode) • Gán: ; := –ii+1