我基本上没有c的经验,所以我不确定为什么这不起作用。
.*
程序应该递归调用事实,直到变为120.然而它打印1.我不确定为什么会这样,所以任何帮助都会受到赞赏。
答案 0 :(得分:3)
您正在传递变量a和b的副本。如果要更新值,请将变量作为指针传递。 修改了下面的代码 -
void fact(int *a, int *b) {
if(*b == 1) {
return;
} else {
*a = *a * *b;
*b = *b - 1;
fact(a, b);
}
}
int main() {
fact(&a, &b);
printf("%d", a);
}
您可以访问以下链接 -
答案 1 :(得分:0)
此函数定义(假设编译器接受它)
void fact(a,b) {
if(b == 1) {
return;
} else {
a = a * b;
b = b - 1;
fact(a, b);
}
}
实际上看起来如下
void fact(a,b)
int a, b;
{
if(b == 1) {
return;
} else {
a = a * b;
b = b - 1;
fact(a, b);
}
}
这是函数定义中的变量a
和b
是函数的局部变量,它具有通过此调用提供给函数的参数的副本
fact(a, b);
因此在函数调用中使用全局变量a
和b
但在函数本身内部使用了局部变量a
和b
,它们是全局变量。这些局部变量的任何变化都不会影响全局变量。
如何解决问题?
第一种方法是删除函数参数。在这种情况下,函数定义中的a
和b
将表示全局变量
void fact( void )
{
if(b == 1) {
return;
} else {
a = a * b;
b = b - 1;
fact(a, b);
}
}
您将获得预期的结果。
第二种方法是使用参数但也返回结果。例如
事实上(a,b) int a,b; { if(b == 1){ 返回; } else {
a = a * b;
b = b - 1;
return fact(a, b);
}
}
并按以下方式调用该函数
a = fact( a, b );
但是不推荐使用这样的函数定义。
最好像
一样写int fact( int a, int b)
{
if(b == 1) {
return a;
} else {
a = a * b;
b = b - 1;
return fact(a, b);
}
}
第三种方法是通过引用将参数传递给函数。例如
void fact( int *pa, int *pb )
{
if( *pb == 1) {
return;
} else {
*pa = *pa * b;
*pb = *pb - 1;
fact(pa, pb);
}
}
并调用函数
fact( &a, &b );
然而,以下列方式编写函数会更简单
int fact( int n )
{
return n < 1 ? 1 : n * fact( n - 1 );
}
并将其称为
a = fact( b );