一、原理
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……
在数学上,这一数列以如下递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
。
二、代码实现
要计算第 n
个斐波那契数列的数字,我们可以使用以下递归函数:
public class MyClass {
public static void main(String[] args){
int n = 10;
System.out.println("斐波那契数列第 " + n + " 个数为 " + Fibonacci(n));
}
//递归 n代表第几个数
public static int Fibonacci(int n) {
//前两个数为 1
//第三个数及后面的数为前面两数之和
//如果输入的 n 不合法将返回 -1
if (n == 1 || n == 2) {
return 1;
} else if (n > 2) {
return Fibonacci(n - 1) + Fibonacci(n - 2);
} else {
return -1;
}
}
}
时间复杂度:
- 最好情况下,当
n
等于1
或2
时,直接返回1
,时间复杂度为O(1)
。 - 最坏情况下,当
n
大于2
时,需要递归调用Fibonacci()
函数计算前两个数的和,时间复杂度为O(2^n)
。因为每次递归调用会产生两个子问题,每个子问题又会产生两个更小的子问题,以此类推,直到递归到n
等于1
或2
。 - 平均情况下,时间复杂度也是
O(2^n)
,因为每个数都需要通过递归调用计算得到。
空间复杂度:
- 由于递归调用会在堆栈中保存每次调用的局部变量和返回地址,所以空间复杂度取决于递归的深度。在最坏情况下,递归深度为
n
,所以空间复杂度为O(n)
。
综上所述,该递归实现的斐波那契数列函数的时间复杂度为指数级的 O(2^n)
,空间复杂度为线性的 O(n)
。由于指数级的时间复杂度,在计算较大的斐波那契数时,递归实现会变得非常慢。
三、运行结果
斐波那契数列第 10 个数为 55