gpt4 book ai didi

c - 恢复 C (gcc) 中的递归函数?

转载 作者:行者123 更新时间:2023-11-30 17:41:36 25 4
gpt4 key购买 nike

我在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() 等的组合,但这些主题的示例让我有点困惑。谢谢。

最佳答案

在不诉诸 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);

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

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

关于c - 恢复 C (gcc) 中的递归函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21061452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com