递归与迭代(斐波那契数列)

2022-09-01 17:09:14

我有两种不同的方法,一种是使用迭代计算第n个元素的斐波那契数列,另一种是使用递归方法做同样的事情。


程序示例如下所示:

import java.util.Scanner;

public class recursionVsIteration {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        //nth element input
        System.out.print("Enter the last element of Fibonacci sequence: ");
        int n = sc.nextInt();

        //Print out iteration method
        System.out.println("Fibonacci iteration:");
        long start = System.currentTimeMillis();
        System.out.printf("Fibonacci sequence(element at index %d) = %d \n", n, fibIteration(n));
        System.out.printf("Time: %d ms\n", System.currentTimeMillis() - start);

        //Print out recursive method
        System.out.println("Fibonacci recursion:");
        start = System.currentTimeMillis();
        System.out.printf("Fibonacci sequence(element at index %d) = %d \n", n, fibRecursion(n));
        System.out.printf("Time: %d ms\n", System.currentTimeMillis() - start);
    }

    //Iteration method
    static int fibIteration(int n) {
        int x = 0, y = 1, z = 1;
        for (int i = 0; i < n; i++) {
            x = y;
            y = z;
            z = x + y;
        }
        return x;
    }

    //Recursive method
    static int fibRecursion(int  n) {
        if ((n == 1) || (n == 0)) {
            return n;
        }
        return fibRecursion(n - 1) + fibRecursion(n - 2);
    }
}

我试图找出哪种方法更快。我得出的结论是,对于较少数量的数字,递归更快,但是随着第n个元素的值增加,递归变得更慢,迭代变得更快。以下是三个不同 n 的三个不同结果:


示例 #1 (n = 10)

Enter the last element of Fibonacci sequence: 10
Fibonacci iteration:
Fibonacci sequence(element at index 10) = 55 
Time: 5 ms
Fibonacci recursion:
Fibonacci sequence(element at index 10) = 55 
Time: 0 ms

示例 #2 (n = 20)

Enter the last element of Fibonacci sequence: 20
Fibonacci iteration:
Fibonacci sequence(element at index 20) = 6765 
Time: 4 ms
Fibonacci recursion:
Fibonacci sequence(element at index 20) = 6765 
Time: 2 ms

示例 #3 (n = 30)

Enter the last element of Fibonacci sequence: 30
Fibonacci iteration:
Fibonacci sequence(element at index 30) = 832040
Time: 4 ms
Fibonacci recursion:
Fibonacci sequence(element at index 30) = 832040
Time: 15 ms

我真正想知道的是,为什么突然迭代变得更快,递归变得更慢。如果我错过了这个问题的一些明显答案,我很抱歉,但我仍然是编程新手,我真的不明白这背后发生了什么,我想知道。请提供一个很好的解释或为我指出正确的方向,以便我自己找到答案。另外,如果这不是测试哪种方法更快的好方法,请让我知道并建议我使用不同的方法。

提前致谢!


答案 1

为了简洁起见,设 F(x) 是递归斐波那契

F(10) = F(9)                      + F(8)
F(10) = F(8)        + F(7)        + F(7) + F(6)
F(10) = F(7) + F(6) + F(6) + F(5) + 4 more calls.
....

所以你把F(8)叫了两次,F(7)3次,F(6)5次,F(5)7次。等等

因此,随着输入的增大,树变得越来越大。


答案 2

本文对递归和迭代进行了比较,并介绍了它们在生成斐波那契数列方面的应用。

如文章中所述,

性能不佳的原因是寄存器在每个递归调用的不良级别中发出的重推爆音。

这基本上说递归方法中的开销更大。

另外,看看备忘录