斐波那契数列的三种解法

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

 

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

斐波那契数列是很典型的一个递归问题,最简单的思路就是使用公式,因为已知F(0)和F(1)所以一直循环递归到0和1项就可以结束。

class Solution {
    public int fib(int n) {
        if(n==1){
            return 1;
        }
        if(n==0){
            return 0;
        }
        return fib(n-1) + fib(n-2);
    }
}

从递归图里可以看出,从F(n-2)到F(0),中间的数字被重复计算了很多次,我们可以将整个树看成一个数组,我们只需要计算nums[0],nums[1]一直到nums[n-1],这样我们就可以去掉重复的内容,进行去重递归

class Solution {
    public int fib(int[] nums, int n) {
        if(n==1){
            return 1;
        }
        if(n==0){
            return 0;
        }
        if(nums[n]!=0){
            return nums[n];
        }
        nums[n] = fib(nums,n-1)+fib(nums,n-2); 
    }
}

我们这样计算完了之后,得到的是一个长度为n的数组,但是经过研究我们可以发现,在计算斐波那契数列的时候我们发现,如果计算F(2),那么我们只需要F(1)和F(0),我们计算F(3)的时候F(0)就失去了作用,那么我们只需要两个数就可以完成计算,我们可以使用双指针,定义low和high分别代表着前两项,计算他们的和之后再将low移到high的地方,high移到他们的和的位置,这样进行循环。

 

class Solution {
    public int fib(int n) {
        if(n==1){
            return 1;
        }
        if(n==0){
            return 0;
        }
        int low=0,high=1;
        for(int i=2;i<=n;i++){
            int sum=low+high;
            low=high;
            high=sum;
        }
        return high;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值