【问题标题】:Why the final output of the recursive function is 5?为什么递归函数的最终输出是5?
【发布时间】:2020-10-24 04:45:18
【问题描述】:

为什么上面代码的输出是5,因为函数应该去第一个5-4-3-2(因为没有输出)循环递减到1所以返回12所以最后12+1.....所以我猜答案一定不是 5?

using namespace std;
int  x()
{
}
int reee(int n)
{
  for(int i=n; i>0; i--)
  {
  if(i==2)
  {
    return x();
  }
  else if(n==1)
  {
    return 12;
  }
  else
  {
     return reee(i-1)+1;
  }
}
}
int main()
{
  cout << reee(5) << " ";
}

【问题讨论】:

  • 这不会编译。另外,return x(); 应该做什么?
  • x() 是空的吗?
  • 你的程序有未定义的行为,因为x 没有返回任何东西。
  • 它永远不会到达 n==1,因为在 i==2 处,x() 被调用,这是非递归的。
  • 这段代码是你写的吗?无论如何,我建议从头开始。目前尚不清楚它应该做什么,但很明显它没有这样做。这看起来是一个学习如何使用调试器的好机会

标签: c++ recursion data-structures recursive-query tail-recursion


【解决方案1】:

在这种情况下不需要 for 循环,因为你的函数已经是一个递归函数,所以它会一直运行该函数直到它为 2。当它为 2 时,它返回 x 使其为空体 + 3。如果你想让它变为 1,在 i==2 的 if 语句中,你应该让它 return(i-1) 因此,您的代码应该是这样的:

using namespace std;

int reee(int n)
{
  if(n==2) {
    return reee(--n);
  } else if(n==1) {
    return (n+12);
  } else {
     return reee(--n)+1;
  }
}
int main()
{
  cout << reee(5) << " ";
}

这应该可以帮助您实现您想要实现的目标。

【讨论】:

  • 其实我的疑惑不在于代码的逻辑。我实际上想知道为什么输出是我的代码的 5。那里发生了什么?
  • 您的 for 循环只运行一次或根本不运行,并且由于变量 i 设置为 n 即 5,因此它返回 (5-1)+1 这将为您提供 5最后,这就是为什么您的代码输出为 5。
  • 但是第一次让我们假设 n=5 然后它返回 ree(4) 然后递归继续。如果我没有错,递归发生在这里!那么为什么最终输出是 5
【解决方案2】:
int  x()
{
}

调用此函数会导致未定义行为,因为声明为返回 int 的函数没有返回任何内容。

启动编译器警告,当您处于学习阶段时,将警告视为错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多