btvn.vn
Tìm kiếm Đăng nhập

Thiết kế đệ quy cho bài toán tính tổng

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Đệ quy · Chọn bài khác

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?
Chọn một đáp án

Bài luyện

Với hàm tong_le trong bài, tong_le(6) trả về bao nhiêu?
Chọn một đáp án

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ở?
Chọn một đáp án

Đang học