leetcode/
fibonacci_number.rs

1//! # 509. 斐波那契数
2//!
3//! 难度 简单
4//!
5//! 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
6//!
7//! ```text
8//! F(0) = 0,   F(1) = 1
9//! F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
10//! ```
11//!
12//! 给定 N,计算 F(N)。
13//!
14//!
15//! ## 示例 1:
16//!
17//! ```text
18//! 输入:2
19//! 输出:1
20//! 解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
21//! ```
22//!
23//! ## 示例 2:
24//!
25//! ```text
26//! 输入:3
27//! 输出:2
28//! 解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
29//! ```
30//!
31//! ## 示例 3:
32//!
33//! ```text
34//! 输入:4
35//! 输出:3
36//! 解释:F(4) = F(3) + F(2) = 2 + 1 = 3.
37//! ```
38//!
39//! ## 提示:
40//!
41//! * `0 ≤ N ≤ 30`
42//!
43//! See [leetcode](https://leetcode-cn.com/problems/fibonacci-number/)
44
45pub struct Solution;
46
47impl Solution {
48    pub fn fib(n: i32) -> i32 {
49        assert!(n >= 0 && n <= 30);
50        let r = (0..n).fold((0u64, 1), |(pp, p), _| (p, pp + p)).0;
51        r as i32
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    fn fib(n: i32) -> i32 {
60        match n {
61            0 | 1 => n,
62            n => fib(n - 1) + fib(n - 2),
63        }
64    }
65
66    #[test]
67    fn test() {
68        assert_eq!(fib(0), Solution::fib(0));
69        assert_eq!(fib(1), Solution::fib(1));
70        assert_eq!(fib(2), Solution::fib(2));
71        assert_eq!(fib(3), Solution::fib(3));
72        assert_eq!(fib(21), Solution::fib(21));
73    }
74}