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

时间:2016-01-16 04:41:30

标签: c function recursion ternary-operator

我的问题是在c中使用三元运算符来查找数字的阶乘。我的下面的代码建议使用递归,不是函数定义,而是参数列表。这在c中有效吗?

[注意:0因子由单独的代码处理]

事实的函数原型是:

int fact(int);

定义如下:

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

我的问题是,就像在函数中调用同一函数的不同实例的递归一样,参数也是如此吗?

3 个答案:

答案 0 :(得分:1)

这不是一个有效的语法,编译器会抱怨这个,因为你在参数区域内编写代码实现。实现必须位于函数签名

后面的花括号范围内

有效语法示例:

long factorial(int n);

// some code

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

参考:http://www.programmingsimplified.com/c-program-find-factorial

答案 1 :(得分:0)

你想要这个:

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

答案 2 :(得分:0)

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

// 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(即long long可能是更好的选择),请在递归版本上尝试fact(100000000),然后您就可以了最有可能是由于堆栈溢出导致的段错误。但是,非递归的将处理这个问题。