【问题标题】:Why this below program is going for infinite loop?为什么下面的程序会进行无限循环?
【发布时间】:2013-08-14 07:43:02
【问题描述】:

当我执行这个 belo 程序时,它无限地打印5。为什么? 是因为递减没有发生还是在递减发生之前发生了函数调用?

我尝试了另一种制作fun(--n)的方法,它给了我正确的答案。但是为什么它不适用于fun(n--)

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(n--);
    }
}

int main()
{
    int n = 5;
    fun(n);
system("pause");
return 0;
}

【问题讨论】:

  • C 和 C++?这不是 C,只是 C++。
  • 因为n-- 返回5
  • 因为您使用后减量运算符,它会一次又一次地为 fun 赋予值 5 ......并且在函数调用 n 后递减。不过,堆栈溢出的收据很好。
  • 顺便说一句,我称之为无限递归。
  • 虽然它与问题无关,但我也将cout &lt;&lt; n &lt;&lt; " " &lt;&lt;endl; 移动到if 之前,因为这样可以使代码更简单,并且不会改变任何内容。

标签: c++ recursion decrement


【解决方案1】:

你需要做foo(--n)而不是foo(n--)

  • --n 将n的值递减,然后发送递减的值
  • n-- 将递减 n 的值,但发送预先递减的 价值。

因此,当您执行foo(n--) 时,您会减少 n 的值,但会在减少之前将 n 发送到 foo 函数。你可以猜到这将永远存在

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(--n);
    }
}

int main()
{
    int n = 5;
    fun(n);
system("pause");
return 0;
}

要详细了解n----n 之间的区别,请阅读here

【讨论】:

  • 函数结束后 不会递减 n。它像 auto tmp = n; --n; fun(tmp); 而不是 fun(n); --n;
【解决方案2】:

注意foo( n-- ) 将返回n,然后将n 减一(参见this),因此返回5、5、5……重复。您需要执行以下一项

foo( --n ); // or,
foo( n - 1 );

...因此您的代码应如下所示:

void fun( int n ) {
  if( !n ) {
    cout << n << " " << endl;
  } else {
    cout << n << " "<< endl;

    n--;
    fun( n );
  }
}

int main( void ) {
  int n = 5;

  fun( n );
  system("pause");

  return 0;
}

旁白:最好不要在另一个表达式中包含任何递增或递减操作。如果你做了以下事情就可以了:

n--;
foo( n );

...如果您在表达式中开始递增和递减,它可能会导致作为客户端(甚至作为程序员)的混乱。将此视为另一个例子,这样做是一个的想法:

if ( ( condition_1 == true ) && ( i++ == val ) )

...如果第一个条件是false,它将永远不会达到第二个条件,因此不会增加i

【讨论】:

    【解决方案3】:

    因为fun(n--); 表示调用fun 的值为n 并且然后 递减n

    【讨论】:

      【解决方案4】:

      因为n-- 返回n 之前 递减它的值。由于您以这种方式调用函数,n 始终具有相同的值。 你可以这样写func(n--)

      int temp = n;
      n = n - 1;
      func(temp);
      

      【讨论】:

      • 它不会在函数结束后递减 n,但 n-- 返回递增完成前 n 的值。它像 auto tmp = n; --n; fun(tmp); 而不是 fun(n); --n;
      • 我明白了,这确实有道理。我会相应地修改我的答案。谢谢!
      【解决方案5】:

      使用fun(--n) 而不是fun(n--)

      出现这种情况的原因是,n-- 在函数运行后递减,并重复返回 5,而 --n 在之前递减。

      【讨论】:

      • @hetepeperfan 将注释。
      • 很明显,因为它确实在问题中说明了它确实有效。但是,这个答案并没有说明原因。
      【解决方案6】:

      试试:

      void fun(int n)
      {
          if(!n)
          {
              cout << n << " " << endl;
          }
          else
          {
              cout << n << " "<<endl;
              fun(--n);
          }
      }
      

      【讨论】:

      • OP 已经在他的问题中表示他知道这是可行的。他想知道为什么。
      【解决方案7】:

      您为 fun() 提供的值与之前调用中提供的值相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多