如何检测根递归调用?

Ahm*_*der 5 c recursion stack

假设我们正在编写一个简单的递归函数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方法.我想知道是否可以使用此属性来编写条件以及如何编写条件.

更新:请注意,这是一个人为的例子,只是为了表达这个想法.这应该从标签中清楚.我不是在寻找标准解决方案.谢谢.

fbr*_*eto 5

根递归调用是调用递归的点,即调用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)


Bli*_*ndy 5

我这样做的方法是使用辅助函数:

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)