TRƯỜNG ĐẠI HỌC DUY TÂN KHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP THỰC HÀNH Môn học: Cấu Trúc Dữ Liệu & Giải Thuật Mã môn học: CS316 Số tín chỉ: 3 Lý thuyết: 2 Thực hành: 1 Dành cho sinh viên ngành: Công nghệ phần mềm, mạng máy tính, cao đẳng tin Khoa: Công nghệ thông tin Bậc đào tạo: Đại học – Cao đẳng Học kỳ: 1 Năm học: 2017-2018 Đà Nẵng, tháng 8 năm 2017 NỘI DUNG THỰC HÀNH Đệ quy - Danh sách đặt (mảng) - Danh sách liên kết - Ngăn xếp và hàng đợi - Cây I. Lý thuyết Khái niệm: Nếu 1 lời giải của bài toán P được thực hiện bằng lời giải của 1 hay nhiều của bài toán P’nhỏ hơn có dạng giống như P thì đó là một lời giải đệ quy. Giải thuật tương ứng với lời giải đệ quy gọi là giải thuật đệ quy. Cấu trúc của giải thuật đệ quy Một giải thuật đệ quy bao giờ cũng gồm 2 phần Phần neo: Xác định điểm kết thúc của một giải thuật đệ quy.
Trường hợp này còn được gọi là trường hợp suy biến. Nếu một giải thuật đệ quy không có trường hợp suy biến thì sẽ dẫn đến lặp vô hạn và sinh lỗi khi thi hành. Phần đệ quy: Phân tích và xây dựng trường hợp chung của bài toán (có nghĩa là đưa bài toán về bài toán cùng loại nhưng với dữ liệu nhỏ hơn). Xây dựng giải thuật đệ quy Khi cài đặt thuật toán đệ quy ta tiến hành những bước sau: Bước 1: Xác định mục đích, đầu vào và đầu ra để từ đó xác định tên tiêu đề hàm (tên hàm và tham số hình thức của nó) Bước 2: Xác định trường hợp suy biến (neo) Nguyễễn Minh Nhậ t Trang 1 Bước 3: Phân tích và xây dựng trường hợp chung của bài toán (phần đệ quy).
Có nghĩa là đưa bài toán về bài toán cùng loại nhưng với dữ liệu nhỏ hơn. Từ 3 bước trên, áp dụng nguyên tắc viết ngôn ngữ ta xây dựng được hàm đệ qui (thông thường sử dụng toán tử điều kiện (if…else) để viết hàm đệ quy. y y Ví dụ 1: Tính x với x được định nghĩa như sau: x y 1x* xy1 khi y 0 khi y 0 Bước 1: Xác định tham số đầu vào là x và y, tham số đầu ra là xy. Ta luôn nhận được giá trị xy duy nhất, do đó ta sử dụng hàm có kiểu trả về.
Bước 2: Phần neo: y=0 thì tổng x0 = 1 Bước 3: Phần đệ quy: là trường hợp thực hiện lại bài toán với giá trị nhỏ hơn y = y - 1. Tức là ứng với trường hợp thực hiện lại lời gọi cũng đều có chung tham số đầu vào là y nhưng với giá trị nhỏ hơn y = y – 1 và đều có khuynh hướng đến trường hợp suy biến y = 0. Giải thuật float x_mu_y (float x, int y) { if(y==0) return 1; else return x*x_mu_y(x,y-1); //gọi đệ quy x_mu_y(x,y-1) tính xy-1 } Ví dụ 2: Đếm số chữ số của số nguyên dương N. Ví dụ N = 152 có 3 chữ số Bước 1: Xác đinh tham số đầu vào là n, tham số đầu ra là số chữ số của n.
Sử dụng hàm có kiểu trả về vì bài toán này trả về một giá trị duy nhất là số chữ số của n. Bước 2: Phần neo: n = 0 thì số chữ số bằng 0. Bước 3: Phần đệ quy: 0nếu n = 0 F(N) = 1 + F(N/10)nếu n > 0 Nguyễễn Minh Nhậ t Trang 2 Hàm đệ quy như sau: int dem(long n) { if(n==0) return 0; else return (1+ dem(n/10)); } //gọi đệ quy dem(n/10) để bớt đi số hàng đơn vị 1 Ví dụ 3: Xuất đảo ngược một số nguyên dương ra màn hình DS(1234) 2 Mod 10 Div 10 DS(123) 3 Màn hình4 Div 10 Mod 10 DS(12) 4 3 Mod 10 Div 10 DS(1) 5 2 Mod 10 Div 10 DS(0) suy biến 6 1 bbbbbbbiến,dừng 7 Giải thuật: 8 void xuat_dao_so(int n) 9 { if (n >0) 10 {cout<< n % 10; 11 xuat_dao_so(n / 10); //gọi đệ quy xuat_dao_so(n/10) để bớt đi số hàng đơn vị 12 } } B. BÀI TẬP LÝ THUYẾT TRẮC NGHIỆM Nguyễễn Minh Nhậ t Trang 3 1.2 point) Theo cách tiếp cận của lập trình có cấu trúc, NiklausWirth đưa ra công thức thể hiện được mối liên hệ giữa cấu trúc dữ liệu và giải thuật như sau: *A.
Thuật toán + cấu trúc dữ liệu = chương trình B. Thuật toán + dữ liệu đầu vào = chương trình C. Kỹ thuật lập trình + cấu trúc dữ liệu = Kết quả đầu ra. Tất cả đều đúng 2.2 point) Chọn phát biểu đúng nhất *A.
Một đối tượng được gọi là đệ quy nếu nó hoặc một phần của nó được định nghĩa thông qua khái niệm về chính nó. Một chương trình gọi là đệ quy nếu trong chương trình có lời gọi đến một chương trình đệ quy khác. Một chương trình đệ quy là chương trình lặp đi lặp lại với số lần lặp không biết trước. Một chương trình đề quy là chương trình có chưa hàm main.2 point) Chọn phát biểu đúng nhất D.
Nếu một lời giải của bài toán P được thực hiện bằng lời giải của bài toán P’, có dạng giống như P thì đó là một lời giải đệ quy B. Giải thuật tương ứng với lời giải đệ quy gọi là giải thuật đệ quy C. Nếu giải thuật đệ quy được viết dưới dạng một thủ tục thì thủ tục ấy được gọi là thủ tục đệ quy. Tất cả đều đúng 4.2 point) Trong giải thuật đệ quy thành phần dừng là: A.
Thành phần neo của thuật toán. Xác định điểm dừng của thuật toán C. Thành phần không chứa khái niệm trong định nghĩa. Tất cả đều đúng 5.2 point) Nguyễễn Minh Nhậ t Trang 4 Giải thuật là … câu lênh chặt chẽ, rõ ràng và xác định các thao tác trên các đối tượng dữ liệu A.2 point) Sau một số ---- bước thưc hiện giải thuật cho chúng ta đạt được kết qua mong muốn A.2 point) Đánh giá độ phức tạp của giải thuật là việc xác định ……và…… mà giải thuật cần để thưc hiện giải một bài toán A, Khoảng thời gian, độ khó B.
Khoảng thời gian, độ phức tạp *C. Khoảng thời gian, dung lượng bộ nhớ máy tính D. Độ khó, dung lượng bộ nhớ máy tính 8.2 point) Các kiểu dữ liệu cơ bản là…… A. Các kiểu dữ liệu mà người lập trình được cung cấp sẵn từ máy tính B.
Các kiểu dữ liệu mà người lập trình được cung cấp sẵn từ ngôn ngữ tự nhiên *C. Các kiểu dữ liệu mà người lập trình được cung cấp sẵn từ ngôn ngữ lập trình D. Các kiểu dữ liệu mà người lập trìn được cung cấp sẵn từ ngôn ngữ này 9.2 point) Chỉ ra kiểu dữ liệu cơ bản: A. Hoten Nguyễễn Minh Nhậ t Trang 5 D.2 point) Chỉ ra kiểu dữ liệu không cơ bản A.2 point) Kiểu dữ liệu trừu tượng là….
Kiểu dữ liệu mà người lập trình tự xây dựng không dựa trên kiểu dữ liệu cơ bản được cung cấp từ ngôn ngữ lập trình B. Kiểu dữ liệu mà người lập trình phải tự xây dựng dựa trên kiểu dữ liệu không cơ bản được cung cấp từ ngôn ngữ lập trình C. Kiểu dữ liệu mà người lập trình phải tự xây dựng dựa trên các kiểu dữ liệu cơ bản được cung cấp từ ngôn ngữ này. *D Kiểu dữ liệu mà người lập trình phải tự xây dựng trên các kiểu dữ liệu cơ bản được cung cấp từ ngôn ngữ lập trình 12.2 point) Kiểu dữ liệu trừu tượng là kiểu nào sau đây: A.2 point) Kiểu dữ liệu cơ bản là kiểu nào sau đây A.
FILE Nguyễễn Minh Nhậ t Trang 6 14.2 point) Chọn đáp án đúng nhất A. Câu trúc dữ liệu cách lưu trữ dữ liệu trong bộ nhớ máy tình (ROM), sao cho nó có thể được sử dụng một cách hiệu quả. Câu trúc dữ liệu cách lưu trữ dữ liệu trong bộ nhớ máy tình (RAM), sao cho nó có thể được sử dụng một cách hiệu quả. Câu trúc dữ liệu cách lưu trữ dữ liệu trong bộ nhớ máy tình (HDD), sao cho nó có thể được sử dụng một cách hiệu quả.
Câu trúc dữ liệu cách lưu trữ dữ liệu trong bộ nhớ máy tình (USB), sao cho nó có thể được sử dụng một cách hiệu quả.2 point) Cho hàm sau: int A(int n){if(n==0) return 0; return n+A(n-1);}. Với n=3 hàm trả về giá trị nào sau đây: A.2 point) Cho hàm sau: int A(int n){if(n==0) return 0; return n*A(n-1);}. Với n=3 hàm trả về giá trị nào sau đây: A.2 point) Cho hàm sau: int A(int n,int m=0){if(n==0) return m; return A(n/10,m*10+n %10);}. Với lời gọi cout<<A(1200) nhận được kết quả nào sau đây: *A.
0021 Nguyễễn Minh Nhậ t Trang 7 C.2 point) Cho hàm sau: int A(int n,int m=0){if(n==0) return m; return A(n/10,m*10+n %10)}. Với lời gọi cout<<A(1200) nhận được kết quả nào sau đây: A.2 point) Cho hàm sau: int B(int n){if(n>0){B(n/10);cout<<n%10<<"\t";}} Với lời gọi cout<<B(102) nhận được kết quả nào sau đây: A.2 point) Chọn phát biểu đúng A. Một đối tượng được gọi là đệ quy, nếu nó không được mô tả thông qua định nghĩa của chính nó. Một đối tượng được gọi là đệ quy, nếu nó được mô tả thông qua định nghĩa của đối tượng khác.
Một đối tượng được gọi là đệ quy, nếu nó được mô tả thông qua định nghĩa của chính nó. Đối tượng đệ quy được định nghĩa bằng những khái niệm đơn giản nhất cùng dạng với nó.2 point) Cho hàm sau: int B(int n){if(n>0){ cout<<n%10<<"\t";B(n/10); }} Với lời gọi cout<<B(102) nhận được kết quả nào sau đây: A. 201 Nguyễễn Minh Nhậ t Trang 8 B.2 point) Cho hàm sau: int B(int n){if(n>0){B(n/2);cout<<n%2<<"\t";}}Với lời gọi cout<<B(10) nhận được kết quả nào sau đây: *A.2 point) Cho hàm sau: int B(int n){if(n>0){ cout<<n%2<<"\t";B(n/2); }}Với lời gọi cout<<B(10) nhận được kết quả nào sau đây: A.2 point) Cho hàm sau: int B(int A[],int n){if(n>0){cout<<A[n]<<"\t";B(A,n/2);}}. Cho A[]={1,2,3,4,5} Với lời gọi B(A,4) nhận được kết quả nào sau đây: *A.2 point) Cho hàm sau: int B(int A[],int n){if(n==0) return 0; return (A[n]+B(A,n-1));} Cho A[]={1,2,3,4,5} Với lời gọi cout<<B(A,4) nhận được kết quả nào sau đây: A.
13 Nguyễễn Minh Nhậ t Trang 9 D. 12 TRẢ LỜI NGẮN 1: Cấu trúc dữ liệu là gì? Cấu trúc dữ liệu khác cấu trúc lưu trữ ở những điểm nào? 2: Nêu khái niệm giải thuật là gì? Mối quan hệ giữa giải thuật và cấu trúc dữ liệu là gì? Nêu các tính chất của giải thuật 3: Một ngôn ngữ lập trình có nên cho phép người sử dụng tự định nghĩa thêm các kiểu dữ liệu có cấu trúc? Giải thích và cho ví dụ. BÀI TẬP THỰC HÀNH 1: Hãy viết mỗi yêu cầu sau bằng giải thuật đệ qui: a. Đổi số n hệ 10 sang hệ nhị phân (chỉ sử dụng đệ qui) d.
Tìm số đảo ngược 1 số nguyên dương.