Giả sử chúng ta có một số nguyên n. Nhiệm vụ là tìm tổng của n số hạng đầu tiên trong dãy Fibonacci. Nếu kết quả quá lớn, trả về kết quả modulo 10^8 + 7.
Ví dụ: với n = 8, dãy Fibonacci 8 số hạng đầu là 0, 1, 1, 2, 3, 5, 8, 13. Tổng của chúng là 33.
Thuật toán
Chúng ta sử dụng kỹ thuật đệ quy có nhớ (memoization) để tính toán hiệu quả:
- Khởi tạo
m = 10**8 + 7và một dictionarymemorỗng. - Định nghĩa hàm
solve(n, m):- Nếu
nđã có trongmemo, trả vềmemo[n]. - Nếu
n < 2, gánmemo[n] = n. - Ngược lại,
memo[n] = (solve(n-1, m) + solve(n-2, m)) % m. - Trả về
memo[n].
- Nếu
- Từ hàm chính, gọi
solve(n, m)để điền đầy đủmemo, sau đó tính tổngngiá trị đầu tiên trongmemo.values().
Ví dụ mã nguồn
m = 10**8 + 7
memo = {}
def solve(n, m):
if n in memo:
return memo[n]
memo[n] = n if n < 2 else (solve(n-1, m) + solve(n-2, m)) % m
return memo[n]
n = 8
solve(n, m)
print(sum(list(memo.values())[:n]))
Đầu vào / Đầu ra
Input: 8
Output: 33