【问题标题】:Why does the recursion happens again after the base call? [closed]为什么在 base call 之后递归又发生了? [关闭]
【发布时间】:2021-08-13 04:51:36
【问题描述】:

所以我正在尝试学习 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语句总是假的,那么在base call之后,函数如何以相反的方式调用自己,函数不应该就结束了吗?

【问题讨论】:

  • 如果你传入5,第一次会是真的……然后递归地再传4次。基本情况完成后,函数 返回 到递归调用之前的位置,从而打印值。
  • 最里面的函数调用确实返回了,调用它的那些还没有完成,因为他们还没有打印出数字。在递归调用之前移动cout&lt;&lt;n&lt;&lt;endl;
  • 你能解释一下为什么你认为那是“总是假的”吗?
  • 我想我现在明白了,所以在基本调用之后,函数返回 1 步返回到调用打印值的位置,因为递归调用现已完成,因此按降序给出值,因为函数将返回到进行递归调用以完成 if 语句的位置。

标签: c++ function recursion


【解决方案1】:

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之前进行了递归调用,因此输出从最内层调用到最外层调用。

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2014-10-02
    • 2010-09-09
    相关资源
    最近更新 更多