编写程序来计算递归调用的数量

时间:2016-04-08 20:38:13

标签: algorithm recursion

假设我有以下递归函数,它返回第n个斐波纳契数:

private int fib(int n) {
    if(n == 1) return 0;
    if(n == 2) return 1;
    return fib(n - 1) + fib(n - 2);
}

如何编写一段代码来返回此函数的递归调用总数?我正在考虑将fib(int n, int count = 0)中的count参数或fib中的静态变量引入为static int count = 0,并在递归调用之前引入递增计数。我没有成功使用这两种方法,因为我无法返回count。有没有办法在不修改原始函数的情况下获得递归调用的总数?

3 个答案:

答案 0 :(得分:1)

您可以通过归纳计算计算F(n)的递归调用次数为2 * F(n) - 1(对于n <= 2为1的基本情况)。尝试编写归纳步骤,如果你不能,我会在稍后用证明更新我的答案。

所以实际上没有必要编写递归算法。还有O(log(n))算法来计算基于矩阵求幂的第n个斐波纳契数。

enter image description here

因此,通过一些数学计算,您最终可以使用O(log(n))算法来查找递归调用的数量。但是,如果您要继续修改自己的功能,可以在大约O(1.6^n)

中找到

答案 1 :(得分:0)

没有修改功能?使用代理..

http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html#proxy

http://java.sun.com/j2se/1.4.2/docs/guide/reflection/proxy.html#examples

Foo foo = (Foo) DebugProxy.newInstance(new FooImpl());
foo.bar(null);

答案 2 :(得分:0)

您可以使用引用变量来跟踪调用函数的时间。

为什么不尝试这样的事情:

#include <iostream>

using namespace std;

 int fib(int n,int& count) {
     count++;
    if(n == 1) return 0;
    if(n == 2) return 1;
    return fib(n - 1,count) + fib(n - 2,count);
}
int main()
{
   int nth=7;
   int count=0;
   int num=fib(nth,count);

   cout<<nth<<"th fibonacci sequence is "<<num<<" function calls: "<<count<<"recursive calls:"<<count-1<<endl;
   return 0;
}