【问题标题】:Why output change when i change cout position after decrementing my function?为什么在减少函数后更改 cout 位置时输出会更改?
【发布时间】:2020-09-05 23:01:58
【问题描述】:

这是我的代码:

#include<iostream>
int x;
void gad(int x)
{
  if(x==0)
      return;
  else{

  std::cout<<"geek"<<" ";
  std::cout<<"for geeks ";

   gad(x-1);
  }
}
int main()
{
  gad(3);
  return 0;
}

输出是这样的

geek for geeks geek for geeks geek for geeks

现在如果改变第二个std::cout的位置 来自

std::cout<<"geek"<<" ";
  std::cout<<"for geeks ";

   gad(x-1);

   std::cout<<"geek"<<" ";
   gad(x-1);
   std::cout<<"for geeks ";

来的输出是这样的

geek geek geek for geeks for geeks for geeks

我的问题是为什么改变std::cout 的位置会改变输出?

我想如果我在函数后面加上cout,由于递归,它不会给出“for geeks”,并且由于if 语句而退出递归循环。

【问题讨论】:

  • 因为 gad() 被递归调用并且 std::cout
  • 当您更改这些行的顺序时,您预计会发生什么?
  • @JaMiT 我想如果我把 cout 放在函数之后由于递归它不会给出“for geeks”并且由于 if 语句而退出递归循环
  • @Zoro-TheScar 这应该是问题的一部分,以便人们可以直接解决您对递归如何工作的误解。 (评论随时可能消失。)

标签: c++ recursion output


【解决方案1】:

您正在打印第一句话,然后进入对同一函数的递归调用,作为回报,该函数将打印第一句话并进入另一个递归调用......等等。 最后一个函数返回后,会继续x=1 打印第二句……等等。 为了可视化发生了什么,这将是调用堆栈:

x=3 ---> 打印第一条语句

x=2 ---> 打印第一条语句

x=1 ---> 打印第一条语句

x=0 ---> 返回

x=1 ---> 继续打印第二条语句并终止

x=2 ---> 继续打印第二条语句并终止

x=3 ---> 继续打印第二条语句并终止

【讨论】:

  • 如果 x 由于递归调用而等于 0,并且由于 if 语句而从 gad() 函数中出来,那么它将如何打印“for geeks”?
  • @Zoro-TheScar return 语句将只终止调用堆栈的当前函数,即gad(0)。所以,gad(1) 将继续工作,然后是 gad(2),最后是 gad(3)
【解决方案2】:

在第一种情况下,您在进行递归调用之前打印两者。 而在第二种情况下,您首先打印“geeks”,然后进行递归调用,再次打印“geeks”等等,直到它返回 null,然后打印“for geeks”,因为它是按顺序打印的下一条语句在递归调用之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2011-05-22
    • 2021-06-06
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多