Từ yêu cầu đến phần cơ sở và lời gọi tiếp
Với $n$ nguyên không âm, cần tính $S(n)=1+2+\cdots+n$; khi $n=0$ thì tổng không có số hạng, bằng 0.
Khi $n>0$, tách số hạng cuối để được $S(n)=n+S(n-1)$. Như vậy, thiết kế có ba ý: hàm trả tổng cần tìm; cơ sở là $S(0)=0$; trường hợp còn lại lấy $n$ cộng tổng của bài toán nhỏ hơn.
```python
def tong(n):
if n == 0:
return 0
return n + tong(n - 1)
```
Đối số n−1 nhỏ hơn n và sẽ tới 0 khi bắt đầu bằng một số nguyên không âm. Không được giữ nguyên n trong lời gọi tiếp.
Lời gọi chờ kết quả của bài toán nhỏ hơn
Tính tong(4) cần tong(3), tiếp tục tới tong(0). Khi cơ sở trả 0, các lời gọi đang chờ mới lần lượt cộng thêm phần của mình.
| Trường hợp | Cách có kết quả | Giá trị |
|---|---|---|
| tong(0) | Cơ sở | 0 |
| tong(1) | 1+0 | 1 |
| tong(2) | 2+1 | 3 |
| tong(3) | 3+3 | 6 |
| tong(4) | 4+6 | 10 |
Hàm không chỉ trả số n của lần gọi đầu; nó chờ tổng nhỏ hơn rồi cộng n vào kết quả đó.
Chỉ cộng n nếu n là số lẻ
Gọi SL(n) là tổng các số tự nhiên lẻ không vượt quá n; đặt SL(n)=0 khi n≤0. Nếu n lẻ, cộng n vào kết quả nhỏ hơn. Nếu n chẵn, không cộng n nhưng vẫn giảm giới hạn.
```python
def tong_le(n):
if n <= 0:
return 0
if n % 2 == 1:
return n + tong_le(n - 1)
return tong_le(n - 1)
```
Ví dụ tong_le(6)=tong_le(5)=5+3+1=9. Cả hai nhánh đều tiến về cơ sở; sự khác nhau nằm ở việc có cộng n hay không.
Bài luyện
Với hàm tong trong bài, tong(5) trả về bao nhiêu?
5 chỉ là số hạng cuối.
10 là tổng tới 4.
120 là5!, khác bài toán tổng.
1+2+3+4+5=15.
Lời giải
`tong(0)=0`; các lời gọi lần lượt cộng1,2,3,4,5. Do đó tong(5)=1+2+3+4+5=15.
Bài luyện
Với hàm tong_le trong bài, tong_le(6) trả về bao nhiêu?
Các số lẻ không vượt6 là1,3,5.
21 cộng cả số chẵn từ 1 tới 6.
12 là tổng các số chẵn2,4,6.
6 chỉ là giới hạn, không phải tổng cần tìm.
Lời giải
6 chẵn nên không được cộng. Các số lẻ cần cộng là1,3,5; tổng bằng 9. Lời gọi với 6 chuyển sang giới hạn 5 rồi tiếp tục tới cơ sở.
Bài luyện
Đang giữ nguyên cơ sở n==0. Với n nguyên không âm, lời gọi nào phù hợp để hàm tong tiến tới cơ sở?
Tên biến không làm đổi dữ liệu của lời gọi.
Số nguyên dương giảm1 sẽ tới 0.
Giá trị giữ nguyên nên chưa tiến về0.
Giá trị tăng lên và rời xa0.
Lời giải
Từ một số nguyên dương, trừ1 liên tiếp sẽ đạt0. Khi đó hàm trả cơ sở và không gọi tiếp; giữ nguyên hoặc tăng n không đáp ứng điểm dừng đã chọn.
Đang học