【问题标题】:why is the for loop going on infinitely in c为什么for循环在c中无限进行
【发布时间】:2021-07-08 19:52:48
【问题描述】:

我的问题是当我运行代码时,循环会无限进行。预期的输出是打印 hi 5 次然后转到新行并打印 4 次 3 等等我无法理解是什么导致循环无限。

#include <stdio.h>
int star(int);
int main()
{
    printf("enter number\n");
    int a;
    scanf("%d", &a);
    star(a);
    return 0;
}

int star(int m)
{

    int n;
    for (n = 0; n < m; n++)
    {
        printf("hi");
    }
    printf("\n");

    star(m - 1);

    return 0;
}

【问题讨论】:

  • 你有没有终止条件的递归。
  • 我..看看你的代码。 star 什么时候会不再自称?
  • 我如何在 c 初学者中添加终止条件
  • 取决于你想要做什么。
  • 您可能想以if (m &lt; 0) return 0; 之类的开头star 或使用if(m &gt; 0) star(m-1); 保护star(m-1);。这样,一旦 m 变为负数,它就不会继续调用自己。

标签: c loops for-loop recursion function-definition


【解决方案1】:

您忘记检查函数中某处是否 m > 0。在这种情况下,循环会无限循环,因为它没有办法摆脱递归。

简单修复:

#include <stdio.h>
int star(int);
int main()
{
    printf("enter number\n");
    int a;
    scanf("%d", &a);
    star(a);
    return 0;
}

int star(int m)
{

    int n;
    for (n = 0; n < m; n++)
    {
        printf("hi");
    }
    printf("\n");
    if (m > 0){
        star(m - 1);
    }
    return 0;
}

【讨论】:

  • 我现在明白了,感谢您的帮助
【解决方案2】:

对于初学者来说,函数star 的返回类型是无用的,没有任何意义。此外,将参数声明为有符号整数类型int 也没有什么意义。将参数声明为至少具有无符号整数类型unsigned int 在逻辑上更正确。

所以函数应该这样声明

void star( unsigned int n );

函数无限递归调用自身,因为这样的调用是无条件的,不依赖于参数m的值。

int star(int m)
{
    //...
    star(m - 1);
   
    return 0;
}

该函数可以通过以下方式定义,如下面的演示程序所示。

#include <stdio.h>

void star( unsigned int );

int main( void )
{
    printf( "Enter number: " );
    unsigned int n;

    if ( scanf( "%u", &n) == 1 ) star( n );

    return 0;
}

void star( unsigned int n )
{
    if ( n )
    {
        for ( unsigned int i = 0; i < n; i++)
        {
            printf( "hi" );
        }

        putchar( '\n' );

        if ( --n ) star( n );
    }
}

请注意,如果最初调用函数时参数等于 0,则该函数不应输出任何内容。

【讨论】:

  • 感谢您的帮助,现在我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2023-04-03
相关资源
最近更新 更多