递归函数是否可以在首次调用它的函数中知道常量而不将常量作为参数发送?

时间:2013-12-22 21:29:55

标签: c++ recursion

因为递归具有推送和弹出激活记录的额外开销,所以在使用常量时是否可以避免这种情况?

例如,如果我有一个功能

void foo(int x) {
   int bar = x;
   fooAux(root);
}

fooAux(Root * root) {
   // Can I somehow do something with the variable bar here?
   // {Insert recursive code}
}

我不确定除了将bar传递给递归函数之外是否有任何其他方法,但这似乎是不必要的,因为我确定它的值不是要改变?也许通过引用传递可以缓解此事?请思考。

3 个答案:

答案 0 :(得分:1)

您可以使用全局变量执行此操作,例如:g_bar。 但是,这使您的功能既不是可重入的也不是优雅的。

你也可以创建一个由上面两个函数和一个bar成员变量组成的独立结构,这将是魔鬼过早优化的一个很好的例子。

答案 1 :(得分:1)

问题不是很清楚,在标题中引用“常量”,但在代码示例中使用变量。

无论如何答案是肯定的,只要线程安全性不是问题,递归辅助函数就可以很容易地引用非递归调用函数中的常量或变量。

您需要做的就是声明变量static

struct Whatever {};

void foo( int x )
{
    static int bar;

    struct Aux 
    {
        static void foo( Whatever )
        {
            (void) bar;
        }
    };

    bar = x;
    Aux::foo( Whatever() );
}

这是个好主意吗?不,它有点过早优化。速度增益(如果有的话)是微不足道的,而维护成本可能很高。

答案 2 :(得分:0)

如果我理解正确,你的问题主要不是关于递归,而是关于范围界定。也许您还可以接受以下答案:函数是否可以访问未作为参数传递的变量(也未在本地定义)

这个问题的答案是"是"。有几种选择:

  • 一个函数可以访问全局变量。在许多情况下,这是一种反模式,而不是你想要的。
  • 闭包有一个非常有趣的概念,它与您正在寻找的非常接近。它允许一个功能访问" environemnt"您的bar变量可以存在。

但是,C ++中没有闭包,我不知道在C ++中模仿闭包的任何优雅方式。也是出于语义原因而发明的闭包(它为程序员提供了更多的功能),而不是出于性能原因。