我知道我需要一个程序计数器,我需要跟踪每个递归调用或步骤,这在for循环中很容易,但对于递归程序来说很难。我被困在如何计算所有递归步骤。到目前为止,这就是我所拥有的。我也在考虑制作我的方法void
,但是int
我可以根据最后的步骤尝试return counter
,但它不起作用。
int fibRec( int x, int counter )
{
if (x == 0)
return 0;
else if (x == 1)
return 1;
else
{
counter++;
return fibRec((x - 1) + (x - 2), counter);
}
}
答案 0 :(得分:2)
这在for循环中很容易,但对于递归程序来说很难
抱歉,你错了 - 在C ++中为递归程序添加计数器等是微不足道的。
a)请注意,不需要全局 b)不需要额外的方法参数。
像往常一样,C ++解决方案是创建一个类
作为类的一部分的非静态递归方法将始终具有this指针,从而访问类的任何部分,包括您可能需要的任何数量的添加计数器和报告或方法。
这是一种可能的方法:
class FibRec
{
public:
FibRec() : counter(0) {
std::cout << "FibRec ctor " << counter << std::endl;
};
~FibRec() { // output final value with dtor
std::cout << "FibRec dtor " << counter << std::endl;
};
int exec( int x )
{
if (x == 0) return 0;
else if (x == 1) return 1;
else
{
counter++;
// dbg: std::cout << counter << " " << x << std::endl;
return (exec(x - 1) + exec(x - 2));
// note -- Fibonacci fix?
}
}
private:
int counter;
};
int t407(void)
{
FibRec f; // class instance
f.exec(5); // invoke recursive method
return(0);
}
注意:使用g ++,ubuntu 15.10上的默认堆栈大小为8 MB。这是一个很多的递归。
不幸的是,你的代码有一个错误 - 它'添加'并且增长很快就会溢出。当计数器为272,261时,我的代码显示溢出。您需要修复代码。
我猜这个代码应该是斐波那契,它是两个中间值的总和。不是你编码的。
您可以通过更改代码来实现您的目标:
return fibRec((x - 1) + (x - 2), counter);
为:
return (fibRec(x - 1, counter) + fibRec(x - 2, counter));
祝你好运。
答案 1 :(得分:1)
您希望将counter
作为参考传递:
int fibRec( int x, int &counter )
这样就可以更新传入的调用者的局部变量。此外,您可能会考虑为基本情况(0和1)增加counter
,因为它们在技术上也是步骤。
答案 2 :(得分:0)
您可以将变量作为参考传递
void fibRec( int x, int &counter )
或者您可以声明一个全局变量计数器,如下面的代码
int counter = 0;
int fibRec( int x )
{
if (x == 0)
return 0;
else if (x == 1)
return 1;
else
{
counter++;
return fibRec((x - 1) + (x - 2));
}
}