我有两种不同的方法,一种是使用迭代计算斐波纳契数列到第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个元素的值增加,递归递减变慢并且迭代变得更快。以下是三个不同的Ñ三个不同的结果:
实施例#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
我真正想知道的是,为什么突然迭代变得越来越快和递归越来越慢。我很抱歉,如果我错过了这个问题的一些明显的答案,但我仍然对编程不熟悉,我真的不明白背后发生了什么,我想知道。请提供一个好的解释或指引我正确的方向,以便我可以自己找出答案。此外,如果这不是一个好方法来测试哪种方法更快,让我知道并建议我不同的方法。
在此先感谢!
调用函数递归地增加开销。 –
这两种方法**不完全相同(即使不包括递归/从图片中迭代) – Justin
第一个问题:您的基准测试方法存在大量缺陷。你真的没有做足够的工作来准确地测量差异。您应该使用'System.nanoTime',并重复多次呼叫,以便测量有用的工作量。接下来,看看每个电话的复杂程度......当n增长时,研究每种情况下完成了多少工作。提示:尝试在纸上走过,如果你调用fibRecursion(8)和fibIteration(8),会发生什么情况。 –