假设我有以下递归函数,它返回第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
。有没有办法在不修改原始函数的情况下获得递归调用的总数?
答案 0 :(得分:1)
您可以通过归纳计算计算F(n)
的递归调用次数为2 * F(n) - 1
(对于n <= 2
为1的基本情况)。尝试编写归纳步骤,如果你不能,我会在稍后用证明更新我的答案。
所以实际上没有必要编写递归算法。还有O(log(n))
算法来计算基于矩阵求幂的第n个斐波纳契数。
因此,通过一些数学计算,您最终可以使用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;
}