C 使用参数递归的数字阶乘(如参数列表中的函数调用)

C 使用参数递归的数字阶乘(如参数列表中的函数调用),c,function,recursion,ternary-operator,C,Function,Recursion,Ternary Operator,我的问题是关于用c中的三元算子求一个数的阶乘。下面的代码建议不要在函数定义中使用递归,而是在参数列表中使用递归。这在c语言中有效吗 [注意:0阶乘由一段单独的代码处理] fact的功能原型是: int fact(int); 定义将是: int fact(num=(num>1)?num*fact(num-1):1) { return num; } 我的问题是,就像递归一样,同一个函数的不同实例在函数中被调用,参数也是如此吗 int fact(int num) { return n

我的问题是关于用c中的三元算子求一个数的阶乘。下面的代码建议不要在函数定义中使用递归,而是在参数列表中使用递归。这在c语言中有效吗

[注意:0阶乘由一段单独的代码处理]

fact的功能原型是:

int fact(int);
定义将是:

int fact(num=(num>1)?num*fact(num-1):1)
{
return num;
}
我的问题是,就像递归一样,同一个函数的不同实例在函数中被调用,参数也是如此吗

int fact(int num)
{
    return num > 1 ? num*fact(num-1) : 1;
}

以下是几种方法[它们将编译成几乎相同的版本--除了非递归版本]:

// this is as close as you can come
int
fact(int num)
{
    return ((num>1) ? num*fact(num-1) : 1);
}

// this also works
int
fact(int num)
{
    if (num > 1)
        num = num * fact(num-1);
    return num;
}

// this also works
int
fact(int num)
{
    if (num > 1)
        num *= fact(num-1);
    return num;
}

// non-recursive version
int
fact(int num)
{
    int i;
    int fac;

    fac = 1;
    for (i = 2;  i <= num;  ++i)
        fac *= i;

    return fac;
}
//这是你能做到的最接近的地方了
int
事实(整数)
{
返回((num>1)?num*事实(num-1):1;
}
//这同样有效
int
事实(整数)
{
如果(num>1)
num=num*事实(num-1);
返回num;
}
//这同样有效
int
事实(整数)
{
如果(num>1)
num*=事实(num-1);
返回num;
}
//非递归版本
int
事实(整数)
{
int i;
int fac;
fac=1;

对于(i=2;i这不是有效的语法,编译器会对此提出投诉,因为您正在参数区域内编写代码实现。实现必须位于函数签名后面的花括号范围内

有效语法示例:

long factorial(int n);

// some code

long factorial(int n)
{
  if (n == 0)
    return 1;
  else
    return(n * factorial(n-1));
}

引用:

在C中不能这样做。第一个会因为缺少分号而导致语法错误。我的错。一个额外的好处:我添加了一个非递归版本[处理0]谢谢,我理解使用递归来实现这一点,但我的问题是如何从参数本身实现它。我的目标是确保控件只进入函数一次。