剑指Offer——斐波拉契数列

  剑指Offer刷题笔记,方便日后查看。

题目描述

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

题目解析

  斐波拉契数列的定义如下:

  1. 方法一:递归
      在开始学习C语言的时候,课本是就是用斐波拉契数列的例子讲解的递归,学习过编程语言的人应该都有印象,还有一道题使用递归的题就是汉诺塔问题,都是很经典的问题。我们都知道递归的优点是代码简洁,将大问题拆解成一样的小问题,用同样的方法去解决。但是递归的效率确实不高,还有一个问题就是可能引起栈溢出。
      我们求解 f ( 10 ) f(10) f(10)为例分析递归的求解过程。想要求 f ( 10 ) f(10) f(10)就要求出发 f ( 9 ) f(9) f(9) f ( 8 ) f(8) f(8),同样。想要求得 f ( 9 ) f(9) f(9),需要先求得 f ( 8 ) f(8) f(8) f ( 7 ) f(7) f(7)…我们可以用树形结构来表示这种关系。如下图所示。
  我们不难发现这颗树上有很多节点是重复的,而且节点重复数会随着n的增大二急剧增大,这意味着计算量会随着n的增大二急剧增大。
  1. 方法二:循环
       更简单的办法是从下往上计算,首先根据 f ( 0 ) f(0) f(0) f ( 1 ) f(1) f(1)算出 f ( 2 ) f(2) f(2),再根据 f ( 1 ) f(1) f(1) f ( 2 ) f(2) f(2)算出 f ( 3 ) f(3) f(3)…以此类推就可以算出第n项了,这种思想的时间复杂度为 O ( n ) O(n) O(n)

代码实现

class Solution {
public:
    int Fibonacci(int n) {
        if(n==0 )
            return 0;
        if(n==1)
            return 1;
     int first=0,second=1,third=0;
     for(int i=2;i<=n;i++){
         third = first+second;
         first = second;
         second = third;
     }
    return third;
    }
};
int main(){
    Solution s;
    int re = s.Fibonacci(32);
    cout<<re<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值