详细讲解斐波那契数
  Bt7uJ85h1EHF 2023年11月02日 28 0

前置知识

斐波那契数列是一种经典的数学序列,它以递归的方式定义。斐波那契数列的前两个数是 0 和 1,之后的每个数都是前两个数之和。换句话说,数列中的每个数(从第三个数开始)都是前两个数之和。

斐波那契数列的数学表达式如下:

F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2)   (对于n ≥ 2)

根据上述定义,斐波那契数列的前几个数依次为:0, 1, 1, 2, 3, 5, 8, 13, 21, ...

下面介绍几种不同的计算斐波那契数列的方法:

  1. 递归方法:最直观的计算斐波那契数列的方法是使用递归。具体实现代码如下:
public static int fibonacci(int n) {
    if (n <= 1) {
        return n;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

这种方法简单易懂,但在计算较大的斐波那契数时会导致性能问题,因为它会重复计算相同的子问题。

  1. 迭代方法:为了避免重复计算,我们可以使用迭代的方式计算斐波那契数列。具体实现代码如下:
public static int fibonacci(int n) {
    if (n <= 1) {
        return n;
    }
    
    int fib = 1;
    int prevFib = 1;
    
    for (int i = 2; i < n; i++) {
        int temp = fib;
        fib += prevFib;
        prevFib = temp;
    }
    
    return fib;
}

迭代方法通过从前往后计算每个斐波那契数,只需保存前两个数即可,避免了重复计算。

  1. 数组缓存方法:为了进一步提高效率,我们可以使用一个数组来缓存已经计算过的斐波那契数,从而避免重复计算。具体实现代码如下:
public static int fibonacci(int n) {
    if (n <= 1) {
        return n;
    }
    
    int[] fibs = new int[n + 1];
    fibs[0] = 0;
    fibs[1] = 1;
    
    for (int i = 2; i <= n; i++) {
        fibs[i] = fibs[i - 1] + fibs[i - 2];
    }
    
    return fibs[n];
}

这种方法在计算较大的斐波那契数时效率更高,因为已经计算过的数不需要重复计算。

以上是几种常见的计算斐波那契数列的方法,它们各有优劣。对于较小的斐波那契数,递归方法可以直观地实现;对于较大的斐波那契数,建议使用迭代或数组缓存方法以提高效率。





例题

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。

示例 1:

  • 输入:2
  • 输出:1
  • 解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

  • 输入:3
  • 输出:2
  • 解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

  • 输入:4
  • 输出:3
  • 解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

  • 0 <= n <= 30


采用动态规划

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:

0 1 1 2 3 5 8 13 21 34 55


示例代码

class Solution {
public:
    int fib(int N) {
        if (N <= 1) return N;
        vector<int> dp(N + 1);
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= N; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[N];
    }
};




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  WaYJTbj6RMqU   2023年11月02日   92   0   0 hiveHbaseciHadoop
  xlvdqsD183Uk   2023年11月13日   46   0   0 分隔符输出格式ci
  I0t3qRT6ovZX   2023年11月02日   47   0   0 bc字符串ci
Bt7uJ85h1EHF