c函数没被调用?

时间:2016-12-07 17:18:20

标签: c function

我基本上没有c的经验,所以我不确定为什么这不起作用。

.*

程序应该递归调用事实,直到变为120.然而它打印1.我不确定为什么会这样,所以任何帮助都会受到赞赏。

2 个答案:

答案 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);
    }

您可以访问以下链接 -

How to update the value in another function

答案 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);
    }   
}

这是函数定义中的变量ab是函数的局部变量,它具有通过此调用提供给函数的参数的副本

fact(a, b);

因此在函数调用中使用全局变量ab但在函数本身内部使用了局部变量ab,它们是全局变量。这些局部变量的任何变化都不会影响全局变量。

如何解决问题?

第一种方法是删除函数参数。在这种情况下,函数定义中的ab将表示全局变量

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