我正在尝试做一个简单的递归函数示例(直接和间接),我似乎无法让它结束你能帮我解释一下原因吗? (此外,我正在尝试在此程序中同时执行Direct和Indirect)感谢您的帮助。
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();
}
编辑:直接和间接的递归,直接应该从同一个函数内部调用,间接是从函数外部调用的,我也为不格式化和跳过而道歉
答案 0 :(得分:3)
让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);
}
do...while
部分看起来很奇怪,你确定需要吗?
答案 1 :(得分:1)
我永远不会是9。因此,一次又一次地调用Print()。
答案 2 :(得分:1)
对于根据C标准的初学者,不带参数的函数main
应声明为
int main( void )
至于递归函数(当它被定义为int Print( void )
时将被声明),那么有几个问题。
第一个是函数返回任何内容,尽管它的返回类型为int
。
int Print()
{
// ...
Print();
}
其次是由于do-while循环
do
{
printf("%d",i);
i++;
}while(i<10);
本声明中的条件
if(i==9)
return 1;
永远不会成立,因为在循环之后变量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;
}
它的输出是
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
或者更直接的方法来定义函数direct_print
和reverse_print
如下
#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;
}
考虑到函数将更灵活,如果它们在函数体内使用参数而不是幻数10
。
例如
#include <stdio.h>
void direct_print( unsigned int n )
{
static unsigned int i;
if ( i == 0 ) i = n;
if ( n )
{
printf( "%u ", i - n );
direct_print( n - 1 );
}
if ( i == n ) i = 0;
}
void reverse_print( unsigned int n )
{
if ( n-- )
{
printf( "%u ", n );
reverse_print( n );
}
}
int main(void)
{
direct_print( 10 );
putchar( '\n' );
reverse_print( 10 );
putchar( '\n' );
return 0;
}
输出与前一个程序的显示相同
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
答案 3 :(得分:0)
来自莫斯科的弗拉德已经对OP问题进行了很好的写作。
我想添加一个带有stop_condition的解决方案。
clickElement("Login");
clickElement("Logout");
输出:
#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);
}
答案 4 :(得分:0)
在您的函数中,返回条件if(i==9)
永远不会满足,因为它总是i=10
。所以你的Print()
函数一直在递归地调用。首先,您需要准确了解使用递归函数所需的条件/情况?在您的示例中,您将在while loop
的帮助下打印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调用此函数时,在条件if(i == 0)
中它将失败,因为第一次调用中i
的值为10.在该条件下,O / S将存储所有中间数据/输出(在这种情况下,它将存储i = 10;)和函数的IP(指令指针,最后执行状态,即Print(--i);
,它是堆栈中每个递归函数中最后执行的语句)。它将在第一次递归调用(Print( - i))中使用Print(9);
调用。整个过程将持续到Print(0)
。但是当使用Print(0)
调用时,函数将返回而不打印值,因为它将在条件if( i == 0 )
之后返回,因为此处i
变为0
。从这一点开始,它将返回上一个呼叫。它如何回到之前的通话?一旦递归函数返回它pop
堆栈并首先获得IP
并且它是中间输出,即i
的值。在这种情况下,当它第一次返回时,i
的当前值为1
,因此在printf
中它将打印1.因为这是函数的最后一行,根据IP,这是要执行的剩余指令。所以它会正常返回。现在它将从堆栈中获取IP,其中函数的变量i
的中间值为2,因此它将打印2
并返回,这将继续直到它在第一次调用中到达,其值为{{ 1}}然后打印10
之后它将返回main。
希望这会对你有所帮助。
答案 5 :(得分:-1)
这是一个使用递归的有限循环,因子为5
i = 5;
fact=1;
while(i)
{
fact = fact*i;
i- -;
}