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- -;
}