C ++递归函数自称为N次?

时间:2014-10-29 12:45:36

标签: c++ function boost recursion

假设我有一个功能:

int recursive(int NbProducts, int NbPlates, int NbPositions)
{ //the following is a recursive function that will call itself 3 times
 //code to be repeated goes here
 recursive(int NbProducts, int NbPlates, int NbPositions);
}

我能弄清楚的是如何让函数知道它的递归数是多少,以及如何阻止它。任何有效和聪明的方法来做到这一点?如果它有助于我使用升压算法。

4 个答案:

答案 0 :(得分:4)

传递一个参数并在执行函数前检查它。如果迭代结束,则返回结果,否则继续

int recursive(int NbProducts, int NbPlates, int NbPositions,int repeat)
{ 
 repeat --;
   if(repeat==0)
 return result;
   else
 recursive(NbProducts, NbPlates, NbPositions, repeat);
}

如果你想重复3次,你只需要说

recursive(NbProducts, NbPlates, NbPositions, 3);

答案 1 :(得分:1)

(警告:这只有在您没有任何功能签名限制时才有效,您没有指定,所以我认为你没有

最简单,最直接的一个:将其作为参数传递,尽管这需要修改函数签名:

// Start
recursive(par1,par2,par3, 0 /* Iteration number */);

int recursive(int NbProducts, int NbPlates, int NbPositions, int iteration)
{ 
   if(iteration == 2)
     return something;
   else {
     ++iteration;
     return recursive(par1,par2,par3,iteration);
   }
}

或等效地将值递减到零。在许多情况下,这也是最常用的prolog方式,其他逻辑语言限制了它们的递归深度。

答案 2 :(得分:1)

尝试这样的事情:

int arecursive(int NbProducts, int NbPlates, int NbPositions, int count)
{ 
  if (count == 0) {
    // ...
  {
  else 
    return recursive(NbProducts, NbPlates, NbPositions, count -1);
}

int recursive(int NbProducts, int NbPlates, int NbPositions)
{ 
 arecursive(NbProducts, NbPlates, NbPositions, 3);
}

答案 3 :(得分:0)

如果您可以更改功能签名,请将其作为参数传递:

int recursive(int NbProducts, int NbPlates, int NbPositions,int repeat) { 
    return (repeat == 1 ? result : recursive(NbProducts, NbPlates, NbPositions, repeat-1);
}

如果您无法更改签名,则需要在函数范围内使用变量来跟踪它。成员变量和包装函数。

int recursive(int NbProducts, int NbPlates, int NbPositions) { 
    return (m_repeat == 1 ? result : recursive(NbProducts, NbPlates, NbPositions, m_repeat-1);
}

int recursive(int NbProducts, int NbPlates, int NbPositions,int repeat) { 
    m_repeat = repeat; // setting the member variable repeat before calling the function
    recursive(NbProducts, NbPlates, NbPositions);
    m_repeat = 0; // just in case
}