如何在不使用静态变量的情况下从递归函数中调用另一个函数一次?

时间:2014-01-03 13:00:45

标签: c++ c recursion

这是我的问题的示例程序,我使用的是VisualStudio 2008

void abc()
{
    static int i = 0;
    if (i==0)
    {
        xyz();
        i++;
    }
    abc();
}

静态变量也在下一个调试会话中保留一个值,因此不调用xyz(),如何在不使用静态变量的情况下调用一次函数?

5 个答案:

答案 0 :(得分:3)

这个怎么样:

void abc(int init)
{
    if(init == 1) xyz();
    abc(0);
}

int main(void) {
  abc(1);
}

它具有清楚显示正在发生的事情的优点。你甚至可以声明一个枚举:

enum INIT {FIRST_TIME, RECURSING};

并做

void abc(enum INIT init) {
  if(init == FIRST_TIME) xyz();
  abc(RECURSING):
}

您可以在http://codepad.org/7euiC5LQ

看到完整的示例
#include <stdio.h>

enum INIT {FIRST, RECURSING};

void abc(enum INIT init) {
  if(init == FIRST) {
   printf("first time\n");
   abc(RECURSING);
  }
  else {
   printf("last time\n");
  }
}

int main(void) {
  abc(FIRST);
} 

在此示例中,第二次是最后一次。显然你可以从那里修饰;通常你会想要将一个参数传递给你的abc函数,这个函数可能随着每次调用而减少,直到你达到某个点“这是递归的结束”(想想factorials,Fibonacci等)。在这种情况下,为初始调用传递“无效”参数(例如-1)将是一个很好的解决方案。你仍然只有一个参数。

最后 - 当您使用C ++时,您可以考虑重载您的功能。使用参数调用它,并包含xyz;没有,你没有,所以称之为。有点像其他答案之一的abcStart。但是既然你用C和C ++标记了你的问题,并且你的代码中没有证据表明你真的想要C ++,我甚至都不去那里......

答案 1 :(得分:1)

不确定这是你正在寻找的但它有效

void abc(){
   abc();
}

void abcStart(){
   xyz();
   abc();
}

int main(){
   abcStart();
}

执行此操作时,您无需指定任何标记或使用任何if。您只需调用递归的“开始”功能

答案 2 :(得分:1)

您可以将callflag传递给abc()函数,作为是否调用xyz()函数的指示。

void abc(int callflag){
   // do somwork
   if(callflag)
      xyz();  // xyz() willbe called when callflag = !0
   // do other stuff
   abc(0)
}

void abcStart(){
  abc(1);
  //abc(0); If you don't want to call xzy even for first time. 
}

我认为,只要您愿意,xyz()内就可以灵活调用abc()

答案 3 :(得分:0)

在调用者中使用布尔变量并将其传递给被调用函数。

#include <stdbool.h> // C99 and latter supports.  

void abc(bool flag)
{
    if (flag)
    {
        xyz();
        flag = false;
    }
    abc(flag);
}

int main(void)    // T is return type
{
    ...

    bool flag = true;
    abc(flag);

    ...
}

答案 4 :(得分:0)

这是一个解决方案,它不会硬编码一次运行xyz,也就是说你以后可以轻易地改变它来运行它任意次数(感谢Floris的答案我改编):

void abc(int i)
{
    if(i > 0)
        {
            xyz();
            i--;
        }
    abc(i);
}

int main()
{
    abc(1);
}