c++ - 为什么理解这个递归示例如此难以凭直觉?

标签 c++ recursion

我很难理解这段代码。我完全理解为什么 foo() 打印这些值,但我无法理解为什么 bar() 反向打印这些值。任何人都可以请无论如何解释这一点,以便我可以直观地感受到它,或者至少给我一个方向以达到赦免。

#include<iostream>
using namespace std;

void bar(int a){
    cout<<"bar: "<<a<<endl;
}

void foo(int a){
    if(a>0){
        a -=1;
        cout<<"foo: "<<a<<endl;
        foo(a);
        bar(a);
    }else{
        cout<<"Foo exited"<<endl;
    }
}

int main(){
    foo(10);
}

[Output]:
foo: 9
foo: 8
foo: 7
foo: 6
foo: 5
foo: 4
foo: 3
foo: 2
foo: 1
foo: 0
Foo exited
bar: 0
bar: 1
bar: 2
bar: 3
bar: 4
bar: 5
bar: 6
bar: 7
bar: 8
bar: 9

最佳答案

如果您不尝试“在脑海中运行整个调用堆栈”,则最好理解递归。抽象地思考:

  • 您打印 n
  • 你下一级
  • 返回后再次打印 n

  • 因此,“单一级别”的输出将是(例如对于 foo(10) ):
    Foo 9
    output of foo(9)
    Bar 9
    

    通过填充 foo(9) 的部分输出来解决多一层
    Foo 9
    Foo 8
    output of foo(8)
    Bar 8
    Bar 9
    

    这种模式一直持续到递归结束。

    代码可能看起来是连续的 foo();bar(); (它是)但是 foo()第一次下降导致 bar()在上升调用堆栈之前被调用。

    关于c++ - 为什么理解这个递归示例如此难以凭直觉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60176907/

    相关文章:

    c++ - 不带星号的函数指针参数

    c++ - 如何使用tinyxml2从XML加载父实体和子实体?

    python - 递归函数与列表理解中的串联错误

    C++ 元编程热切求值

    c++ - 将函数声明为 __attribute__(nothrow) 和 `throw()` 有什么区别

    c++ - 如何优化我的 AVX 代码

    postgresql - 在postgresql中使用递归创建多个递增列

    php - 排序步骤和子步骤

    python - 如何在 Python 中动态构建树

    c++ - 在 C++ 中为 unordered_set 声明散列函数?