写一个函数,输入 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;
}
}