C 如何结束递归函数?

C 如何结束递归函数?,c,recursion,C,Recursion,我正在尝试做一个简单的递归函数(直接和间接)的例子,但我似乎无法结束它。你能帮我解释一下原因吗?(我也尝试在这个项目中做直接和间接)谢谢你的帮助 int Print(); int main() { Print(); return 1; } int Print() { int i=0; do { printf("%d",i); i++; }while(i<10); if(i==9) ret

我正在尝试做一个简单的递归函数(直接和间接)的例子,但我似乎无法结束它。你能帮我解释一下原因吗?(我也尝试在这个项目中做直接和间接)谢谢你的帮助

int Print();
int main()
{
    Print();
    return 1;
}
int Print()
{
    int i=0;
    do
    {
        printf("%d",i);
        i++;
    }while(i<10);
    if(i==9)
        return 1;
    Print();
}
int Print();
int main()
{
打印();
返回1;
}
int Print()
{
int i=0;
做
{
printf(“%d”,i);
i++;

}而(i让
i
成为函数的一个参数

#include <stdio.h>

int Print(int);
int main()
{
    Print(9);
    return 1;
}
int Print(int i)
{
    if (i <= 0) {
      return 1;
    }
    printf("%d",i);
    return Print(i-1);
}
#包括
int打印(int);
int main()
{
印刷品(9);
返回1;
}
int打印(int i)
{

如果(i在您的情况下,我永远不会是9。因此,反复调用Print()。

对于初学者,根据C标准,没有参数的函数
main
应声明如下

int main( void )
至于递归函数(当它被定义为
intprint(void)
)时应该声明),那么有几个问题

第一个是,尽管函数的返回类型为
int
,但它不返回任何内容

int Print()
{
    // ...
    Print();
}
其次,由于do-while循环

do
{
    printf("%d",i);
    i++;
}while(i<10);
因为在循环之后变量
i
等于
10
,所以函数具有无限递归

您应该使用对函数本身的调用,而不是循环

这些功能可以按照以下方式定义,如下面的演示程序所示

#include <stdio.h>

void direct_print( void )
{
    enum { N = 10 };
    static int i = N;

    if ( --i ) 
    {
        direct_print();
    }
    printf( "%d ", i );
    ++i;
}

void reverse_print( void )
{
    enum { N = 10 };
    static int i = N;

    printf( "%d ", --i );

    if ( i ) 
    {
        reverse_print();
    }
    ++i;
}


int main(void) 
{
    direct_print();
    putchar( '\n' );
    reverse_print();
    putchar( '\n' );

    return 0;
}
或者更直接的方法来定义函数
直接打印
反向打印

#include <stdio.h>

void direct_print( void )
{
    const unsigned int N = 10;
    static unsigned int i;

    if ( i < N )
    {
        printf( "%u ", i++ );
        direct_print();
    }
    else
    {
        i = 0;
    }
}

void reverse_print( void )
{
    const unsigned int N = 10;
    static unsigned int i;

    if ( i < N )
    {
        printf( "%u ", N - ++i );
        reverse_print();
    }
    else
    {
        i = 0;
    }
}

int main(void) 
{
    direct_print();
    putchar( '\n' );
    reverse_print();
    putchar( '\n' );

    return 0;
}
输出与前一程序所示相同

0 1 2 3 4 5 6 7 8 9 
9 8 7 6 5 4 3 2 1 0 

莫斯科的弗拉德在OP问题上已经写得很好了

我想添加一个带有停止条件的解决方案

#include<stdio.h>

void Print(int i, int stop_condition);

int main(void)
{
  Print(0, 10);
  putchar( '\n' );

  return 0;
}

void Print(int i, int stop_condition)
{
    printf("%d ",i++);

    if(i<stop_condition)
        return Print(i, stop_condition);
}

在函数中,返回条件
if(i==9)
永远不会满足,因为它总是
i=10
函数将永远保持递归调用。首先,您需要一个确切的情况,即在什么条件/情况下需要使用递归函数?在您的示例中,您正在借助
while循环
打印从1到9的值。现在,如何通过使用递归函数实现同样的效果

 void Print(int i)
 {
       if( i == 0 )//when i become 0 you are not printing but returning 
          return;
       else
          Print(--i);//decrement the value by one each time you are calling it recursively
       printf("%d\n",i);
}
你这样称呼它:-

Print(10); // now it will print from 1 till 10;
但是它是如何工作的呢?当你第一次用参数10调用这个函数时,在条件
中如果(i==0)
它将失败,因为在第一次调用中
i
的值是10。在这种条件下,O/S将存储所有中间数据/输出(在这种情况下,它将存储i=10;)和函数的IP(指令指针,堆栈中的最后执行状态是
Print(-i);
这是每个递归函数中最后执行的语句)。在第一次递归调用(Print(-i))中,它将使用
Print(9);
进行调用。整个过程将持续到
Print(0)
。但是当它使用
Print(0)进行调用时
函数将在不打印值的情况下返回,因为它将在条件
之后返回(i==0)
因为这里
i
变成了
0
。从这一点开始,它将返回到上一个调用。它如何返回到上一个调用?一旦递归函数返回它
pop
s堆栈,首先获得
IP
及其中间输出,即
i
的值。在这种情况下,当它返回第一个tim时e、
i
的当前值是
1
,因此在
printf
中,它将打印1。因为这是函数的最后一行,根据IP,这是要执行的剩余指令。因此它将正常返回。现在它将从堆栈中获取IP,其中函数的变量
i
的中间值为2,因此它将打印
2
并返回,这将继续,直到在第一次调用中达到它的值
10
,然后打印
10
,它将返回到main


希望这能对您有所帮助。

这是一个使用递归的有限循环,5的阶乘

              i = 5;
              fact=1;
               while(i)
              {
                 fact = fact*i;
                  i- -;
              }

它应该是
do…..
…而
do
你只有一次,我永远不会是9岁…一个解决方案使
int i=0
变成
static int i=0
请正确格式化你的代码。它只是不可读。@MrAlan请详细说明“直接”和“间接”是什么意思函数必须这样做。这不会编译。递归函数总是需要访问外部变量。可以作为参数传递,也可以作为全局变量传递(我不建议这样做)。您的打印函数只使用了一个本地变量,我不需要它,但我只是在测试它,它也可以工作,非常感谢。@MrAlan如果答案令人满意,您可以接受/投票。谢谢。很抱歉,第一次在这里不知道D:再次感谢!@coredump在原始帖子中,该函数没有参数。@vladfroman这很糟糕,它应该有一个参数。
0 1 2 3 4 5 6 7 8 9 
 void Print(int i)
 {
       if( i == 0 )//when i become 0 you are not printing but returning 
          return;
       else
          Print(--i);//decrement the value by one each time you are calling it recursively
       printf("%d\n",i);
}
Print(10); // now it will print from 1 till 10;
              i = 5;
              fact=1;
               while(i)
              {
                 fact = fact*i;
                  i- -;
              }