【发布时间】:2020-11-16 11:56:42
【问题描述】:
我注意到我的带有记忆功能的递归斐波那契算法仅适用于大于 12 的值。
我将它与其他人的方法实现进行了比较,其中他也传递了一个数组。我认为每次传递一个数组,在重新调用该方法时会占用太多内存,从而使程序变慢,但事实并非如此。
不知何故,我仍然无法理解我的外部数组如何不比正常的递归斐波那契算法快。我认为这可能是因为我的 if 中有许多条件,我检查它是否较慢,但我不确定。
如果可能的话,你会看看我的代码并告诉我我做错了什么或者后台发生了什么吗?
public class Fibonacci2 {
int memory[];
public Fibonacci2(int f) {
if (memory == null) {
memory = new int[f+1];
memory[0] = 0;
memory[1] = 1;
memory[2] = 1;
}
}
public int recursive(int f) {
if (memory[f-1] != 0 && memory[f-2] != 0 && f>2) {
memory[f] = memory[f-1] + memory[f-2];
} else if (memory[f-1] == 0 && memory[f-2] != 0 && f>2) {
memory[f] = recursive(f-1) + memory[f-2];
} else if (f>2) {
memory[f] = recursive(f-1) + recursive(f-2);
}
return memory[f];
}
}
public class Fibonacci1 {
public Fibonacci1() {}
public int recursive(int f) {
if (f > 2) {
return recursive(f-1) + recursive(f-2);
} else {
return 1;
}
}
}
public class Main {
public static void main(String[] args) {
int fibo = 12;
Fibonacci1 fiboEx1 = new Fibonacci1();
Fibonacci2 fiboEx2 = new Fibonacci2(fibo);
int a = fiboEx1.recursive(fibo);
long start = System.nanoTime();
long stop = System.nanoTime();
System.out.println("fibo of " + fibo + " is " + a);
System.out.println("Fibonacci time without memorization: " + (stop-start));
int b = fiboEx2.recursive(fibo);
start = System.nanoTime();
stop = System.nanoTime();
System.out.println("fibo of " + fibo + " is " + b);
System.out.println("Fibonacci time with memorization: " + (stop-start));
}
}
【问题讨论】:
-
还有一个提示:您的记忆版本必须在第一次运行时计算数字。只有在那之后,它才能使用记忆的状态。所以如果你只调用一次函数,你不会得到任何好处。仅在后续调用中