1. 题目描述
写一个函数,输入 n
,求斐波那契(Fibonacci)数列的第 n
项(即 F(N)
)。
斐波那契数列的定义如下:
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2)
2. 代码
public class ques10 {
public static void main(String[] args) {
int a = Fibonacci2(7);
System.out.println(a);
}
//递归解法
public static int Fibonacci(int n){
if(n <= 0)
return 0;
if(n == 1)
return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
//正常的循环:时间复杂度o(N)
public static int Fibonacci2(int n){
int[] result = new int[]{0,1};
if(n < 2)
return result[n];
int q1 = 1;
int q2 = 0;
int q = 0;
for (int i = 2; i <= n; i++) {
// q1为前一个,q2为前两个
q = q1 + q2;
q2 = q1;
q1 = q;
}
return q;
}
}
3. 说明
该题较为简单,主要是用来展示递归与循环的差异。
递归实现的代码较为简洁,但性能不如循环。
该题中,利用递归从下往上算,会浪费许多计算资源。原因如下:
计算F(10)需要计算F(9)与F(8),而计算F(9)需要计算F(8)与F(7),此时F(8)被计算了两次,这就是浪费计算资源的原因所在。图示: