算法学习记录六(C++)--->获取斐波那契数列第n项

描述

  • 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
    n<=39

分析

这东西第一眼想到的就是递归,但是递归就会有问题,请看;
f(n) = f(n-1) + f(n-2)
随便弄个简单的数字,其实你拆开来就会这样
Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
= Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
= Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);

很明显,重复计算了

int Fibonacci(int n)
    {
        if(n <= 1)
        {
            return n;
        }
        else
        {
            return Fibonacci(n - 1) + Fibonacci(n - 2);
        }
    }

而且这种n一大,直接栈溢出

解法一


class Solution {
public:
    int Fibonacci(int n) {
        // 非常容易理解,0,1,2的时候单独处理
        if(n <= 0){
            return 0;
        }
        if(n == 1 || n ==2){
            return 1;
        }
        int a = 1;
        int b = 1;
        int result;
        // 然后处理的时候获取到A+B的结果,然后把B赋值给A,结果赋值给B,一步步忘后面移动
        for(int i = 3;i<=n;i++){
            result = a + b;
            a = b;
            b = result;
        }
        return result;
    }
};

解法二

class Solution {
public:
    // 动态规划版本 总之核心就是先获取两者相加的结果,然后再把结果减去A值,得到B值
    int Fibonacci(int n) {
        int i = 0;
        int j = 1;
        while(n--){
            j += i;
            i = j - i;
        }
        return i;
    }
};

你可能感兴趣的:(数据结构和算法)