首页 > 解决方案 > 为什么在 base call 之后递归又发生了?

问题描述

所以我正在尝试学习 c++,我已经达到了递归的主题,我遇到了一个问题。

void myfun(int n)
{
    if(n>0)
    {
        myfun(n-1);
        cout<<n<<endl;
    }
    else 
    {
        cout<<"Stop"<<endl;
    }
}

int main()
{
    int n = 5;
    myfun(n);
}`

程序的输出是这样的:

stop
1
2
3
4
5

我的问题是,既然 if 语句总是假的,那么函数如何在基本调用之后以相反的方式调用自身,函数不应该结束吗?

标签: c++functionrecursion

解决方案


myfun(5)函数调用的控制流分解为(在伪代码中):

call myfun(5)
= [call myfun(4), print "5"]
= [[call myfun(3), print "4"], print "5"]
= [[[call myfun(2), print "3"], print "4"], print "5"]
= [[[[call myfun(1), print "2"] print "3"], print "4"], print "5"]
= [[[[[call myfun(0), print "1"], print "2"] print "3"], print "4"], print "5"]
= [[[[[[print "Stop"], print "1"], print "2"] print "3"], print "4"], print "5"]

其中每一层括号表示对 的递归调用myfun

由于您在打印之前进行了递归调用n,因此输出从最内层调用到最外层调用。


推荐阅读