C 优化嵌套递归

C 优化嵌套递归,c,recursion,C,Recursion,我正在使用一个解释器,内部实现有时需要在求值函数之间进行递归,问题是有时我可能需要执行数千次递归来满足一个任务,但程序显然溢出了堆栈 我的实施方案如下: void compute(Program program) { // Evaluate operations by calling specifics function... for (int i = 0; i < program.op_nbr; i++) eval_operation(&progr

我正在使用一个解释器,内部实现有时需要在求值函数之间进行递归,问题是有时我可能需要执行数千次递归来满足一个任务,但程序显然溢出了堆栈

我的实施方案如下:

void compute(Program program) {
    // Evaluate operations by calling specifics function...
    for (int i = 0; i < program.op_nbr; i++)
        eval_operation(&program.operations[i]);
}

void eval_operation(Operation op) {
    // Evaluate the operation
    switch (op->kind) {
        ...
        case Something: return eval_thing(&op->thing);
        ...
    }
}

void eval_thing(Thing thing) {
    for (int i = 0; i < thing.op_nbr; i++)
        eval_operation(&thing.operations[i]);
}

我觉得这很奇怪。interperter的递归与要解释的程序的复杂性有关系,而这通常并不多。例如,函数中的一些嵌套循环。所以,如果对象是一个对象,嵌套的数据结构可能有3个深度,一个操作可能有5到10个,深度可能有30个,这应该不会导致堆栈溢出。我认为你的翻译模型有问题。啊。。。事实上,我用我的语言解释了“函数”操作(
thing
将在这里表示它们,因此需要计算的操作列表)。如果我想用要解释的语言的函数进行递归,我必须对主体求值,求值次数与调用主体的次数相同。我使用阶乘(递归)函数进行了测试,该函数一直运行到0,与C中一样,递归的数量也因此受到限制。实际上,我不知道还有什么其他方法可以做到。每次计算完主体后,该函数的递归为零。所以可能有数千个递归,但它们从来都不是深的。好吧,那么你知道我的堆栈溢出问题是从哪里来的吗?这只发生在有递归函数要求值的情况下(当然是在一些递归之后)。同样在C中,如果递归太深,就会出现堆栈溢出,那么为什么不在解释器中呢?
void foo() {
    return bar();
}

void bar() {
    return foo();
}