Fibonnacci递归调用

时间:2018-11-10 15:24:38

标签: java recursion tracing

为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);
      }
}

我最终跟踪了递归调用,以发现此方法被调用了多少次,但这实在不切实际。它是否具有封闭形式的函数,您可以在其中替换测试的值以知道您将获得多少个递归调用?

请注意,这是我以前的考试中的一个问题,(写考试)我知道我可以使用计数变量。很抱歉没有首先提到这一点。这就是为什么要问是否有一个封闭形式的函数。

4 个答案:

答案 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);}`