【问题标题】:How to call a function only once in a recursive function?如何在递归函数中只调用一次函数?
【发布时间】:2018-07-23 15:18:18
【问题描述】:

我只想调用一次递归函数。我像对静态变量一样尝试了它,但它抛出了一个错误。有人可以提出解决方案吗?

说我有函数recur(int j):

void recur(int x){
    if(x==0)
        return;
    //want x to be xth fibnocci number,but only at initialization.
    x=fib(x);
    cout<<x<<" ";
    recur(x-1);
}

recur(5) 的输出应该是 {5,4,3,2,1} 而不是 {5,3,1}我只想在函数内部做。

【问题讨论】:

  • 为什么不把fib(x)传递给recur(fib(x))这样的函数呢?这是该变量的起始值应该存在的地方
  • 注释掉这一行x=fib(x);

标签: c++ function recursion static


【解决方案1】:

任何时候你想让一个变量在函数中以某种方式开始(无论它是否是递归的),你应该通过函数参数来处理它。该函数已设置为具有初始化阶段。

例子:

void recur(int x){
    if(x==0)
        return;
    cout<<x<<" ";
    recur(x-1);
}

int main() {
    recur(fib(x));
    return 0;
 }

【讨论】:

    【解决方案2】:

    我们可以使用静态布尔标志变量来存储我们是否计算了斐波那契数。在基本情况下,该标志可以设置为 false,这样它就不会影响未来的调用。还有其他方法可以取消设置标志位,比如使用标志位判断函数是否是第一次调用,递归调用后取消设置标志位。

    #include <iostream>
    
    void recur(int x)
    {
        static bool flag = false;
        if(x==0)
        {
            flag = false; //this happens near the end of the recursive calls
            return;       //so we can unset the flag here
        }
        if(!flag)
        {
            x = fib(x);
            flag = true;
        }
        std::cout<<x<<" ";
        recur(x-1);
    }
    
    int main()
    {
        recur(3);
        std::cout << '\n';
        recur(5);
        std::cout << '\n';
        return 0;
    }
    

    第二版:

    #include <iostream>
    
    void recur(int x)
    {
        static bool flag = false;
        if(x==0)
        {
            return;
        }
        bool otherFlag = false;
        if(!flag)
        {
            x = fib(x);
            flag = true;
            otherFlag = true;
        }
        std::cout<<x<<" ";
        recur(x-1);
        if(otherFlag)
        {
            flag = false;
        }
    }
    
    int main()
    {
        recur(3);
        std::cout << '\n';
        recur(5);
        std::cout << '\n';
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多