首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在递归函数中只调用一次函数?

如何在递归函数中只调用一次函数?
EN

Stack Overflow用户
提问于 2018-07-23 23:18:19
回答 2查看 1.9K关注 0票数 -2

我只想调用一个递归函数一次。我尝试了它,就像我们对静态变量所做的那样,但它抛出了一个错误。有人能给出一个解决方案吗?

假设我有recur(int j)函数

代码语言:javascript
复制
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}。我只想在函数内部完成。

EN

回答 2

Stack Overflow用户

发布于 2018-07-23 23:27:06

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

示例:

代码语言:javascript
复制
void recur(int x){
    if(x==0)
        return;
    cout<<x<<" ";
    recur(x-1);
}

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

Stack Overflow用户

发布于 2018-07-24 09:09:10

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

代码语言:javascript
复制
#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;
}

第二个版本:

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51482207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档