剑指offfer10:斐波那契数列

1. 题目描述

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。

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

        F(0) = 0

        F(1) = 1

        F(n) = F(n-1) + F(n-2)

2. 代码

public class ques10 {

    public static void main(String[] args) {
        int a = Fibonacci2(7);
        System.out.println(a);
    }

    //递归解法
    public static int Fibonacci(int n){
        if(n <= 0)
            return 0;
        if(n == 1)
            return 1;
        return Fibonacci(n-1) + Fibonacci(n-2);
    }

    //正常的循环:时间复杂度o(N)
    public static int Fibonacci2(int n){
        int[] result = new int[]{0,1};
        if(n < 2)
            return result[n];

        int q1 = 1;
        int q2 = 0;
        int q = 0;
        for (int i = 2; i <= n; i++) {
            // q1为前一个,q2为前两个
            q = q1 + q2;
            q2 = q1;
            q1 = q;
        }
        return q;
    }
}

3. 说明

该题较为简单,主要是用来展示递归与循环的差异。

递归实现的代码较为简洁,但性能不如循环。

该题中,利用递归从下往上算,会浪费许多计算资源。原因如下:

计算F(10)需要计算F(9)与F(8),而计算F(9)需要计算F(8)与F(7),此时F(8)被计算了两次,这就是浪费计算资源的原因所在。图示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值