斐波拉契数列(剑指offer)
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出
来源:力扣(LeetCode)
链接:[https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof]
第一种解法(递归)
public int fib(int n) {
if(n == 0){
return n;
}else if(n == 1){
return n;
}
return fib(n-1)+fib(n-2);
}
在java语言中,使用递归调用时,如果过多的调用容易造成java.lang.StackOverflowError即栈溢出和程序执行过慢,这是一个潜在Bug和影响程序执行效率问题。
第二种解法(循环)
public int fib(int n) {
if(n == 0){
return n;
}else if(n == 1){
return n;
}
int n1 = 0;//作为n-2
int n2 = 1;//作为n-1
int n3 = 0;//和,作为中间结果
for(int i = 2;i<=n;i++){
n3 = (n2+n1) % 1000000007;
n1 = n2;
n2 = n3;
}
return n3;
}
循环就没有超时问题了。