在C(gcc)中恢复递归函数?

时间:2014-01-11 11:01:45

标签: c gcc recursion

我在linux下使用gcc(gnu99)。 假设我有一个简单的函数来计算(比如打印)一些值。 为了在不诉诸阶乘的情况下解决问题,让我提出这个小玩具功能:

void rec(int val, int nd)
{
   val *= 10; nd++;
   for (int u=0; u<=9; u++, val++)
       if (val && 0==(val%(nd*nd)))
       {
         printf("%d\n",val);
         rec(val,nd);
       }
}

称为rec(0,0),将打印86个正数,其长度k的每个前缀都可以被k ^ 2整除(最大值为6480005)。

问:有没有一种标准方法可以将它变成一个可以重复调用的例程,每次都返回一个新值,直到它以某种方式发出没有更多值的信号?

在实践中,我需要一种方法来调用rec(),获取一个值,然后能够从原来的位置恢复执行,以获得下一个值等等。

我考虑过使用setjmp(),longjmp(),setcontext()等组合,但这些主题的例子让我感到困惑。 感谢。

2 个答案:

答案 0 :(得分:0)

如果不诉诸setjmp()及其喜欢的话,我会想到实现目标的两种可能性。

定义在其上运行的结构和功能

您可以定义包含您感兴趣的州的结构:

struct S {
  int *  numbers;
  size_t length;
  size_t current;
}

以及一组对其进行操作的函数:

// Basically your rec(val,nd) function
int initialize(int val, int nd, S* s);
// Get the next value
int getNextValue(const S* s);
...
// Free memory
void Sfree(S* s);

将状态嵌入到您自己的函数中

在这种情况下,您将持久状态(使用一些static变量)直接嵌入到函数rec()中。持久化此状态将在对函数的不同调用中保留,并允许您跟踪函数被调用的次数以及您可能需要的任何其他信息。请注意,如果在多线程环境中使用此解决方案,则需要特别小心。

答案 1 :(得分:0)

在C ++中,这是通过一个包含state(变量)的类来完成的。

在C中,首选的操作方法是将此statecontext传递给函数。

使用全局状态,因为您会发现它会导致太多问题。

示例:

int foo(struct fooContext* c, int arg1, int arg2) {
}