如何计算递归程序的步骤

时间:2016-05-02 23:11:17

标签: c++ recursion

我知道我需要一个程序计数器,我需要跟踪每个递归调用或步骤,这在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);
    }
}

3 个答案:

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