C++学习递归函数,执行结果不明白

C++学习:递归函数中,使用if语句打印数值结束后为什么反着又打印了一遍?

执行结果见图片

#include  <iostream>
using namespace std;

void div(double val)
{
    cout << "Entering val =" << val <<endl;
    if(val > 1)
        div( val / 2 )
    else
        cout << "--------------------------" << endl;
    cout << "Leaving val =" << val <<endl;
}

int main()
{
    div(1024);
    return 0;
}

img

你这两个cout啊
写在递归调用前面的cout会正序输出,写在递归调用后面的cout会倒序输出

你这个执行结果第7行应该是if(val > 1)吧
一个是Entering ,一个是Leaving

1、你这个if(val < 1)逻辑不应该打印这样的结果的,结果应该是
Entering val =1024


Leaving val =1024

2、递归类似于压栈,是先进后出,也就是递归调用前的先执行,一直执行到不再调用递归函数,开始从内往外执行递归函数下边的语句。
如果你的if判断是if(val > 1)则结果就是你贴出来的这个。

内存空间存储变量的,递归是自己调用自己

  1. div(1024),系统跳转到函数div,参数为1024,这个没问题吧?
    cout << "Entering val =" << val <<endl;
    这个是你程序的第一次打印,Entering val = 1024
    接下来关键了:如果val > 1,会跳转 div(512),注意div 达到了递归,但是。。。。参数为1024 的时候,div 后面的代码还没有执行完
  2. div(512),同1024,打印Entering val = 512
    .....
    ....
    ...
    最后一次div(1),刚进去就打印了Entering val = 1,但是条件val > 1 不符合,进入下一个cout,打印了Leaving val =1
  3. div(1) 成功退出,系统跳转回div(2)
  4. div(2) 成功退出,系统跳转回div(3)
    ...
    ...
    ...
    系统跳转回 div(1024)

img

关于递归,如果初学弄不明白执行过程,可以不需要理解。只需要了解一点:函数的功能。你知道div函数是干啥的,以及它的思路,执行过程就肯定不会出错。