Hai cơ sở phải xuất hiện trước lời gọi tiếp
Đầu vào của hàm là n nguyên không âm. Với n=0 hoặc n=1, hàm trả kết quả trực tiếp; với n≥2, hàm dùng hai giá trị trước.
```python
def fibonacci(n):
if n == 0:
return 0
if n == 1:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
```
Ví dụ fibonacci(3) cần fibonacci(2)+fibonacci(1). Giá trị fibonacci(2)=1+0=1, nên fibonacci(3)=1+1=2. Đây là hàm trả về số, khác hàm chỉ in ở bài trước.
Giữ cấu trúc, thay đúng cơ sở hoặc công thức
Với Lucas, cơ sở là lucas(0)=2 và lucas(1)=1; ở n≥2 trả về lucas(n−1)+lucas(n−2). Với Pell, cơ sở là pell(0)=0 và pell(1)=1; ở n≥2 trả về 2×pell(n−1)+pell(n−2).
```python
def pell(n):
if n == 0:
return 0
if n == 1:
return 1
return 2 * pell(n - 1) + pell(n - 2)
n = 5
for k in range(n):
print(pell(k), end=" ")
```
Đoạn cuối in 0,1,2,5,12 theo các chỉ số 0,1,2,3,4. **In n phần tử đầu** không phải chỉ gọi pell(n); với n=5, pell(5)=29 là một giá trị khác.
Tính được biểu thức vẫn cần return để trả kết quả
Nếu ở hàm fibonacci bỏ return của dòng cuối, gọi fibonacci(2) vẫn tính biểu thức 1+0 nhưng không trả số 1 cho nơi gọi; hàm trả None. Những lời gọi lớn hơn còn có thể lỗi khi cộng với None. Vì vậy, với hàm tính một giá trị, cần kiểm kết quả được trả về ở mọi nhánh.
Cách Fibonacci đệ quy trực tiếp còn tính lặp lại một số trường hợp; chẳng hạn fibonacci(4) cần fibonacci(2) ở nhiều nhánh. Mẫu dùng n nhỏ để quan sát, không khẳng định đệ quy luôn nhanh hơn vòng lặp.
Chạy mẫu với cơ sở, giá trị nhỏ và dữ liệu sai
Mở tệp Python mẫu bằng trình soạn thảo đã dùng, chạy với Python3. Mẫu thử nhận n nguyên từ 0 đến 12 để giữ phép tính đệ quy trực tiếp nhỏ; đây là phạm vi của mẫu thử, không phải giới hạn chỉ số của các dãy.
Với n=5, cần nhận F(n)=5, L(n)=11, P(n)=29 và năm số Pell đầu0,1,2,5,12. Với n=0, ba giá trị lần lượt0,2,0; phần in các số Pell đầu không có số nào. Nhập chữ hoặc n âm phải được báo dữ liệu không phù hợp trước khi gọi các hàm tính dãy. Nếu kết quả lệch, kiểm cơ sở, hệ số 2 của Pell và giới hạn range(n).
Bài luyện
Với hàm fibonacci trong bài, fibonacci(3) trả về giá trị nào?
F3=F2+F1=1+1.
3 là F4, khác chỉ số đang hỏi.
1 là F1 hoặc F2.
0 là F0.
Lời giải
F0=0, F1=1 nên F2=1+0=1. Từ đó F3=F2+F1=1+1=2; hàm trả về số 2.
Bài luyện
Chỉ bỏ return ở dòng cuối của hàm fibonacci, giữ nguyên hai cơ sở. Lời gọi fibonacci(2) trả về gì?
Hai lời gọi với1 và0 vẫn dừng ở cơ sở.
Biểu thức tính xong nhưng kết quả không được trả về.
1 là giá trị của biểu thức, không được return trong bản đã sửa.
Hai cơ sở cho biểu thức 1+0, không phải2.
Lời giải
Hai lời gọi cơ sở cho1 và0 nên biểu thức được tính thành 1. Nhưng thiếu return, hàm đi tới cuối và trả None; ở n=2 không phải lỗi thiếu điều kiện dừng.
Bài luyện
Đoạn for k in range(5) in pell(k) dùng chỉ số cuối nào?
0 chỉ là chỉ số đầu.
6 vượt phạm vi của vòng lặp.
Range(5) cho0,1,2,3,4.
Giới hạn5 không nằm trong range(5).
Lời giải
Range(5) có năm số nguyên từ 0 đến4. Vì vậy số Pell cuối được in là P4=12; đoạn này không in P5=29.
Đang học