假设我们正在编写一个简单的递归函数fib(n)来计算第n个Fibonacci数.现在,我们希望函数打印第n个数字.由于重复调用相同的函数,必须存在仅允许根调用打印的条件.问题是:如何在不传递任何其他参数或使用全局/静态变量的情况下编写此条件.
所以,我们正在处理这样的事情:
int fib(int n) {
if(n <= 0) return 0;
int fn = 1;
if(n > 2) fn = fib(n-2) + fib(n-1);
if(???) cout << fn << endl;
return fn;
}
int main() {
fib(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为root调用与所有子节点的不同之处在于返回不同的调用者,即本例中的main方法.我想知道是否可以使用此属性来编写条件以及如何编写条件.
更新:请注意,这是一个人为的例子,只是为了表达这个想法.这应该从标签中清楚.我不是在寻找标准解决方案.谢谢.
根递归调用是调用递归的点,即调用main.鉴于此,您可以稍微重写代码(类似这样):
int fib(int n) {
if(n <= 0) return 0;
int fn = 1;
if(n > 2) fn = fib(n-2) + fib(n-1);
return fn;
}
int main() {
cout << fib(5) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我这样做的方法是使用辅助函数:
int _fib(int n) {
if(n <= 0) return 0;
int fn = 1;
if(n > 2) fn = _fib(n-2) + _fib(n-1);
return fn;
}
int fib(int n) {
int fn=_fib(n);
cout << fn << endl;
return fn;
}
Run Code Online (Sandbox Code Playgroud)
或者,你可以这样写(c ++):
int fib(int n, bool f=true) {
if(n <= 0) return 0;
int fn = 1;
if(n > 2) fn = fib(n-2, false) + fib(n-1, false);
if(f) cout << fn << endl;
return fn;
}
Run Code Online (Sandbox Code Playgroud)