算法学习记录六(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;
    }
};
【问题描述】 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值