斐波那契数列及系列问题

来源:互联网 发布:可爱p图软件 编辑:程序博客网 时间:2024/05/17 07:10

斐波那契数列,即 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);

原创粉丝点击