leetcode/
fibonacci_number_offer.rs

1//! # 剑指 Offer 10- I. 斐波那契数列
2//!
3//! 难度 简单
4//!
5//! 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
6//!
7//! ```text
8//! F(0) = 0,   F(1) = 1
9//! F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
10//! ```
11//!
12//! 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
13//!
14//! 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
15//!
16//!
17//! ## 示例 1:
18//!
19//! ```text
20//! 输入:n = 2
21//! 输出:1
22//! ```
23//!
24//! ## 示例 2:
25//!
26//! ```text
27//! 输入:n = 5
28//! 输出:5
29//! ```
30//!
31//!
32//! ## 提示:
33//!
34//! * `0 <= n <= 100`
35//!
36//! See [leetcode](https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/)
37
38pub struct Solution;
39
40impl Solution {
41    pub fn fib(n: i32) -> i32 {
42        assert!(n >= 0 && n <= 100);
43        let r = (0..n).fold((0u128, 1), |(pp, p), _| (p, pp + p)).0 % 1_000_000_007;
44        r as i32
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51    const P: i32 = 1_000_000_007;
52
53    fn fib(n: i32) -> i32 {
54        match n {
55            0 | 1 => n,
56            n => (fib(n - 1) % P + fib(n - 2) % P) % P,
57        }
58    }
59
60    #[test]
61    fn test() {
62        assert_eq!(fib(0), Solution::fib(0));
63        assert_eq!(fib(1), Solution::fib(1));
64        assert_eq!(fib(2), Solution::fib(2));
65        assert_eq!(fib(3), Solution::fib(3));
66        assert_eq!(fib(21), Solution::fib(21));
67        // assert_eq!(fib(44), Solution::fib(44));
68        // assert_eq!(701408733, fib(44));
69        assert_eq!(701408733, Solution::fib(44));
70        assert_eq!(583861472, Solution::fib(55));
71        assert_eq!(687995182, Solution::fib(100));
72    }
73}