Professional Documents
Culture Documents
Báo Cáo
Báo Cáo
Báo Cáo
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
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)
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)
dequy(1)=2 dequy(0)=0
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};}
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
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
i++ end
8
V. Hệ thức truy hồi.