我只想调用一个递归函数一次。我尝试了它,就像我们对静态变量所做的那样,但它抛出了一个错误。有人能给出一个解决方案吗?
假设我有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}
。我只想在函数内部完成。
发布于 2018-07-23 23:27:06
任何时候你想让一个变量在函数中以某种方式开始(不管它是递归的还是非递归的),你都应该通过函数参数来处理。该函数已设置为具有初始化阶段。
示例:
void recur(int x){
if(x==0)
return;
cout<<x<<" ";
recur(x-1);
}
int main() {
recur(fib(x));
return 0;
}
发布于 2018-07-24 09:09:10
我们可以使用静态布尔标志变量来存储我们是否计算了斐波那契数。在基本情况下,可以将该标志设置为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;
}
https://stackoverflow.com/questions/51482207
复制相似问题