美文网首页程序员
斐波那契数列相关算法

斐波那契数列相关算法

作者: 极速魔法 | 来源:发表于2017-02-04 15:39 被阅读25次

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

//递归的思想
public class Solution {
    public int Fibonacci(int n) {
        if(n<=0){
            return 0;
        } else if(n==1 || n==2){
            return 1;
        } else{
            return Fibonacci(n-1)+Fibonacci(n-2);
        }
    }
}

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法

//迭代的思想
public class Solution {
    public int JumpFloor(int target) {
        int  temp_1=1,temp_2=2;
        int result=3;
        if(target<=0){
            return 0;
        } else if(target==1){
          return 1;
        } else if(target==2){
            return 2;
        } else{
            for(int i=1;i<target-1;i++){
                result=temp_1+temp_2;//考虑target=3 的情况,先算result
                temp_1=temp_2;
                temp_2=result;     
            }
            return result; //n>=3的return值
        }
    }
}

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

//f(n)=f(n-1)+f(n-2)+...f(0),f(n-1)不管前面的走法,只差一步到n级,以此类推。
//f(n-1)=f(n-2)+f(n-3)+...f(0),得到f(n)=2f(n-1)
public class Solution {
    public int JumpFloorII(int target) {
        if(target==0 || target==1){
            return 1;
        }else {
            int result=1,temp=1;
            for(int i=2;i<target+1;i++){
              //迭代的思想
                result=2*temp;
                temp=result;
            }
            return result;
        }
    }
}

我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

/*
*考虑最后的情况,一个1*2 的矩形覆盖 f(n-1),或者两个2*1的矩形覆盖 f(n-2);和为f(n-1)+f(n-2)
*/
public class Solution {
    public int RectCover(int target) {
        if(target==1){
            return 1;
        } else if(target==2){
            return 2;
        } else if(target<=0){
            return 0;
        }else{
            int temp1=1,temp2=2;
            int result=0;
            for(int i=3;i<=target;i++){
                result=temp1+temp2;
              //更新temp1 的值
                temp1=temp2;
              //更新temp2 的值
                temp2=result;
                
            }
            return result;
        }
    }
}

这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入3,10,81
输出1,5,40

/*
*递归的思想,递归到底的条件是n=1,2,3 的情况。n=4 时可以考虑 
drink的饮料数=先兑换的4/3+喝完空瓶兑换以及剩余空瓶兑换的(喝完的4/3+剩下的4%3)
*/
int softWater(int n){
    if (n<=1){
        return 0;
    }
    else if(n==2 || n==3){
        return 1;
    } else{
        return n/3+softWater(n/3+n%3);
    }
}

相关文章

网友评论

    本文标题:斐波那契数列相关算法

    本文链接:https://www.haomeiwen.com/subject/gaojittx.html