Báo Cáo

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 10

Trường Đại Học Giao Thông Vận Tải

Khoa Công Nghệ Thông Tin

Báo Cáo Bài Tập Giữ Kì

Giảng viên hướng dẫn:Th.s Nguyễn Ngọc Thạch


Sinh viên thực hiện: Nguyễn Quốc Phong
Mã số sinh viên:2251120232
Lớp: CN22E
Tên môn học: Kỹ thuật lập trình
Mã môn học: 010112400108
Câu hỏi:
Cho hệ thức truy hồi
a0= 0, a1 =2
an =5an-1 – 6an-2
Dùng C/C++ để cài đặt tính số hạng thứ n bằng 5 cách:
1. Dùng hàm đệ quy
2. Dùng vòng lặp
3. Dùng mảng 1 chiều
4. Dùng mảng 2 chiều
5. Tìm nghiệm của hệ thức truy hồi rồi cài đặt
(Xây dựng 1 menu lựa chọn các cách)

1
I. Hàm đệ quy
-Hàm đệ quy là hàm mà từ một điểm trong thân của nó có thể
gọi tên hàm của chính nó
-Hàm đệ quy có nhiều loại nhưng trong bài toán này chúng ta sẽ
sử dụng đệ quy nhị phân(trong thân hàm có hai lời gọi hàm gọi
lại chính nó)
*Cấu trúc của hàm đệ quy
-Một hàm đệ quy có 2 phần:
+Phần cơ sở: Điều kiện để thoát khỏi đệ quy. Nếu như không có
phần này, hàm đệ quy sẽ thực hiện mãi mãi gây ra tràn bộ nhớ
Stack.
+Phần đệ quy: Thân hàm có chứa phần gọi đệ quy, thực hiện cho
đến khi thỏa mãn điều kiện ở phần cơ sở.
*Giải thuật của bài toán bằng đệ quy

Phần cơ sở :a0=0 và a1=2

Phần đệ quy: an =5an-1 – 6an-2

2
Giả sử n=3 giải thuật sẽ diễn ra như sau:
dequy(3)=5*dequy(2)-6*dequy(1)
Gọi dequy(1)

Trả kết quả lại cho dequy(2) Gọi dequy(2)


Trả kết quả lại cho dequy(1)

dequy(2)=5*dequy(1)-6*dequy(0) dequy(1)=2

Trả kết quả lại cho dequy(1) Gọi dequy(2) Gọi dequy(0)

Trả kết quả lại cho dequy(0)

dequy(1)=2 dequy(0)=0

Việc giải bài toán dequy(3) sẽ phân rã từ dequy(3) xuống


dequy(0) rồi lần lược trả ngược kết quả các bài toán nhỏ lên các
bài toán lớn hơn đã gọi nó, cho tới khi đạt được kết quả của bài
toán ban đầu.
Nguyên lí của việc này là do máy tính khi nhận thấy một bài
toán chưa được giải ở lời gọi đệ quy, nó sẽ tạm thời lưu bài toán
đó vào một ngăn xếp(stack) theo từ trên xuống dưới như vậy các
bài toán chưa được giải sẽ xếp chồng lên nhau theo thứ tự bài
toán lơn hơn ở dưới, và bài toán nhỏ hơn ở trên.
Việc giải các bài toán lại được thực hiện từ trên xuống dưới, như
vậy bài toán ở bên dưới(là bài toán lớn hơn) sẽ thu nhận được
kết quả của bài toán bên trên (là bài toán nhỏ hơn),...Tiếp tục
thực hiện như vậy cho tới khi trong ngăn xếp chỉ còn lại một bài
toán cuối cùng, đó chính là bài toán gốc.

3
Stack (ngăn xếp) là một cấu trúc dữ liệu hoạt động theo nguyên
tắc LIFO (Last In First Out), vào sau ra trước

Ưu điểm: thuận lợi cho việc biểu diễn bài toán, đồng thời làm
gọn chương trình.
Nhược điểm: không tối ưu về mặt thời gian, gây tốn bộ nhớ và
có thể tràn stack nếu n quá lớn.

Tổng quan: Cách giải quyết này sử dụng hàm đệ quy để tính số
hạng thứ n. Hàm đệ quy này sẽ gọi lại chính nó để tính số hạng
thứ n. Tuy nhiên, phương pháp này không hiệu quả với các giá
trị lớn của n và có thể dẫn đến tràn bộ nhớ.

4
II. Vòng lặp.
Vòng lặp là thực thi một dãy lệnh nhiều lần
Có rất nhiều loại vòng lặp(while,do_while,…) nhưng trong bài
toán này chúng ta sẽ dùng vòng lặp for để giải quyết bài toán.
Cách giải quyết này sử dụng vòng lặp for để tính số hạng thứ n.
Ta sử dụng hai biến a0 và a1 để lưu trữ hai số hạng đầu tiên, sau
đó sử dụng vòng lặp để tính toán các số hạng tiếp theo cho đến
khi tính được số hạng thứ n. Phương pháp này hiệu quả hơn
phương pháp đệ quy và không gây tràn bộ nhớ.
*Cấu trúc của vòng lặp for
for ({Khởi tọa giá trị biến lặp}; {Điều kiện lặp}; {Cập nhật giá trị biến lặp})
{
{thân vòng lặp};}

* Flow chart của vòng lặp


5
Begin

Input n
a0=0
a1=2
end

T
n=0
return a0

T
n=1 return a1

i=2 end

T
i<=n

an=5*a1-6*a0
a0=a1 F
a1=an

i++ return an

end

6
III. Mảng 1 chiều
Chúng ta sử dụng mảng một chiều để lưu trữ hai số hạng đầu
vào mảng a0 tại vị trí index bằng 0 và a1 có vị trí index bằng 1
để tính toán các số hạng tiếp theo.Ta sử dụng mảng arr để lưu
trữ các số hạng và sử dụng vòng lặp để tính toán các số hạng
tiếp theo cho đến khi tính được số hạng thứ n.
* Flow chart của mảng 1 chiều.

Begin

arr[n+1]
a[0]=0
a[1]=2
i=2

T
i<=n

a[i]=5*a[i-1]-6*a[i-2] return a[n]

i++ end

7
IV. Mảng 2 chiều.
Chúng ta sử dụng mảng hai chiều để lưu trữ hai số hạng đầu vào
mảng a0 tại vị trí arr[0][0] và a1 có vị trí arr[1][0] để tính toán
các số hạng tiếp theo.Ta sử dụng mảng hai chiều arr để lưu trữ
các số hạng thứ n và sử dụng vòng lặp để tính toán các số hạng
tiếp theo cho đến khi tính được số hạng thứ n.
Kết quả chúng ta sẽ lấy ở hàng n cột 0 (arr[n][0])
*Flow chart của mảng 2 chiều

Begin

arr[n+1][2]
a[0][0]=0
a[1][0]=2
i=2

T
i<=n

arr[i][0]=5*arr[i-1][0]-6*arr[i-2][0] return a[n][0]

i++ end

8
V. Hệ thức truy hồi.

You might also like