为fib(6)调用fib方法多少次。 fib方法是
public static long fib(long index) {
if (index == 0) // Base case
return 0;
else if (index == 1) // Base case
return 1;
else // Reduction and recursive calls
return fib(index - 1) + fib(index - 2);
}
}
我最终跟踪了递归调用,以发现此方法被调用了多少次,但这实在不切实际。它是否具有封闭形式的函数,您可以在其中替换测试的值以知道您将获得多少个递归调用?
请注意,这是我以前的考试中的一个问题,(写考试)我知道我可以使用计数变量。很抱歉没有首先提到这一点。这就是为什么要问是否有一个封闭形式的函数。
答案 0 :(得分:0)
您可以传递某种Counter作为附加参数,每次调用该函数时,该参数都会增加:
class Counter {
private int value = 0;
public void increment() {
value++;
}
public int getCurrentValue() {
return value;
}
}
这样您的代码将变为:
public static long fib(long index, Counter counter) {
counter.increment();
if (index == 0) // Base case
return 0;
else if (index == 1) // Base case
return 1;
else // Reduction and recursive calls
return fib(index - 1, counter) + fib(index - 2, counter);
}
}
调用:
Counter counter = new Counter();
fib(6,counter);
counter.getCurrentValue(); // retrieve the current value which is exactly the number of invocation of fib function
答案 1 :(得分:0)
一种选择可能是向包含的类添加静态计数器:
public class YourFib {
private static int counter;
public static long fib(long index) {
++counter;
if (index == 0) // Base case
return 0;
else if (index == 1) // Base case
return 1;
else // Reduction and recursive calls
return fib(index - 1) + fib(index - 2);
}
public static void main(String[] args) {
counter = 0;
fib(6l);
System.out.println("There were " + counter + " recursive calls.");
}
}
顺便说一句,使用递归计算斐波那契数列是严重次优的。您应该阅读有关这样做的动态编程的文章,其中每个级别只需要计算一次。
答案 2 :(得分:0)
您可以使用类似的东西
public class A {
private static int count = 0;
public static void main(String[] argv) {
System.out.println(fib(6));
System.out.println(count);
}
public static long fib(long index) {
count++;
if (index == 0) // Base case
return 0;
else if (index == 1) // Base case
return 1;
else // Reduction and recursive calls
return fib(index - 1) + fib(index - 2);
}
}
答案 3 :(得分:0)
在主函数public static int count = 0;
中创建一个整数变量。然后将这个变量放入您的递归函数中,如下所示:
`public static long fib(long index) {
count ++;
if (index == 0) // Base case
return 0;
else if (index == 1) // Base case
return 1;
else // Reduction and recursive calls
return fib(index - 1) + fib(index - 2);}`