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