Java 递归计算斐波那契数列指定位置上的数字

Java 递归计算斐波那契数列指定位置上的数字

一、原理

斐波那契数列(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 等于 12 时,直接返回 1,时间复杂度为 O(1)
  • 最坏情况下,当 n 大于 2 时,需要递归调用 Fibonacci() 函数计算前两个数的和,时间复杂度为 O(2^n)。因为每次递归调用会产生两个子问题,每个子问题又会产生两个更小的子问题,以此类推,直到递归到 n 等于 12
  • 平均情况下,时间复杂度也是 O(2^n),因为每个数都需要通过递归调用计算得到。

空间复杂度:

  • 由于递归调用会在堆栈中保存每次调用的局部变量和返回地址,所以空间复杂度取决于递归的深度。在最坏情况下,递归深度为 n,所以空间复杂度为 O(n)

综上所述,该递归实现的斐波那契数列函数的时间复杂度为指数级的 O(2^n),空间复杂度为线性的 O(n)。由于指数级的时间复杂度,在计算较大的斐波那契数时,递归实现会变得非常慢。

三、运行结果

斐波那契数列第 10 个数为 55

猜你喜欢

转载自blog.csdn.net/qq_45256357/article/details/131962349