第一个代码不能实现的原因是,你没有在a函数中返回c的值。当你递归调用a函数时,你没有把返回值赋给c,所以c的值一直是1。你可以在a函数中加上return c;或者在递归调用时写c = a(b, c);来解决这个问题。
第二个代码可以实现的原因是,你使用了全局变量x和y,它们的值在整个程序中都有效。当你递归调用a函数时,你改变了x和y的值,所以最后y的值就是阶乘结果。但是这种写法不太好,因为全局变量会增加程序的复杂度和出错的可能性。你可以尝试用局部变量和参数来实现相同的功能。
我希望这对你有帮助。如果你还有其他问题,欢迎继续提问。
这是我改进后的代码,你可以试试看效果:
#include <stdio.h>
long a (long b,long c);
long a (long b,long c)
{
if (b--)
{
c *= (b+1);
c = a(b ,c); // 把返回值赋给c
}
return c; // 返回c的值
}
int main(void)
{
long b = 0;
long c = 1;
printf("求正整数阶乘,请输入正整数:\n");
scanf("%d",&b);
printf("阶乘为:%ld",a(b,c));
}
#include <stdio.h>
int a(int x, int y); // 使用参数x和y
int a(int x, int y)
{
if (--x)
{
y *= (x+1);
y = a(x, y); // 把返回值赋给y
}
return y; // 返回y的值
}
int main(void)
{
int x = 5;
int y = 1;
y = a(x, y); // 调用a函数并把返回值赋给y
printf("%d\n",y);
}
|