Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使阶乘函数可重入?_C_Factorial_Reentrancy - Fatal编程技术网

C 如何使阶乘函数可重入?

C 如何使阶乘函数可重入?,c,factorial,reentrancy,C,Factorial,Reentrancy,我应该写一个可重入阶乘函数,当我搜索什么是可重入函数时,我发现了很多定义,比如可重入函数不应该使用静态或全局变量,函数在使用时不能更改,我避免使用静态或全局变量,但我不知道我的函数是否可以重入 #include <stdio.h> int fact(int n){ int c,fact = 1; for (c = 1; c <= n; c++) fact = fact * c; return f

我应该写一个可重入阶乘函数,当我搜索什么是可重入函数时,我发现了很多定义,比如可重入函数不应该使用静态或全局变量,函数在使用时不能更改,我避免使用静态或全局变量,但我不知道我的函数是否可以重入

    #include <stdio.h>

    int fact(int n){
       int c,fact = 1;
       for (c = 1; c <= n; c++)
           fact = fact * c;
        return fact;
    }
    int main()
    {   
        int n;  
        printf("Enter a number to calculate its factorial\n");
        scanf("%d", &n);
        fact(n);
        printf("Factorial of %d = %d\n", n, fact(n));

      return 0;
    }
#包括
整数事实(整数n){
int c,事实=1;
对于(c=1;c您的函数,
fact(n)
,既没有使用全局数据也没有使用静态数据,没有修改自己的代码,也没有在中调用另一个不可重入的函数

你的职能

int fact(int n){
   int c,fact = 1;
   for (c = 1; c <= n; c++)
       fact = fact * c;
    return fact;
}
int事实(int n){
int c,事实=1;

对于(c=1;c,您的函数不仅是可重入的,而且是纯的(用某些编译器的术语来说,)

原因是:

  • 它只有返回值的副作用
  • 其返回值完全取决于参数的值

您可以谈论递归函数。
int-fact(int-n){if(n==1)返回1;return n*fact(n-1);}
和一个
终端
版本将是
int-fact(int-n,int-val){if(n==1)返回val;返回事实(n-1,val*n);}
递归函数在默认情况下是可重入的吗?这就是您的意思吗?对于您的示例,我不确定您是否在谈论这个问题。reentrant=可以从多个线程调用的函数,vs,recursive=在其实现中调用自身的函数。您确定您的练习是关于“reentrant”的吗“没有在”@Jean-BaptisteYunès中调用另一个不可重入函数。我冒昧地进行了修改,因为不仅仅是我注意到了这一点。