假设我有一个功能:
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);
}
我能弄清楚的是如何让函数知道它的递归数是多少,以及如何阻止它。任何有效和聪明的方法来做到这一点?如果它有助于我使用升压算法。
答案 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
}