斐波那契数列及系列问题

斐波那契数列,即 0,1,1,2,3,5,8...,从第三个数开始,数值为前两个数之和。对于该数列,求解第n项只需要通过迭代即可完成。

public class Solution {
    public int Fibonacci(int n) {
        int left=0,right=1,result=0;
        if(n<0)
            return -1;
        else if(n==0)
            return 0;
        else if(n==1)
            return 1;
        else{
            for(int i=2;i<=n;i++){
                result = left + right;
                left = right;
                right = result;
            }
            return result;
        }
    }
}
从理解上来说,由数列的性质可以看出f(n)=f(n-1)+f(n-2),因此还可以递归求解。
public class Solution {
    public int Fibonacci(int n) {
		if(n<0)
            return -1;
        else if(n==0)
            return 0;
        else if(n==1)
            return 1;
        else
            return Fibonacci(n-1)+Fibonacci(n-2);
    }
}
不过,通过递归求解会导致一系列的问题,首先就是其无法求解n较大的情况,当n较大时,会导致栈溢出。然后就是效率低下的问题。显然第一种求解方式更加合适。

虽然该递归求解的方法存在着不足,这种递归的思想却是有助于对很多问题进行求解。例如跳台阶问题,矩形覆盖问题:

跳台阶问题:一只青蛙一次可以跳一级台阶,也可以跳两级台阶。问跳上n级台阶有多少种跳法?

这个问题可以用递归的思想求解。由于青蛙一次只能跳一级或二级台阶,因此对于n级台阶的跳法f(n),f(n)=f(n-1)+f(n-2),由此可以通过求解斐波那契数列第n项的方法来求解。

矩形覆盖问题:用n个2*1的小矩形覆盖1个2*n的大矩形,求有多少种覆盖方法?

这个问题同理,对于n等于1与2来说,很容易求解出答案分别为1与2。因此从n>2开始,对于n=i且i>2,由于i与i-1相比只多了一个2*1,因此n=i时所包含的解的数量包括了n=i-1的解的数量;除此之外,由于n>2,存在着两个矩形并排竖着排列的情况,因此n=i的解还应当包含n=i-2的解,即n=i-2的每个解都在最上端添加两个竖着的小矩形这种情况,所以f(i)=f(i-1)+f(i-2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值