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

Posted

技术标签:

【中文标题】使用参数递归的数字阶乘(如参数列表中的函数调用)【英文标题】:factorial of number using argument recursion(as in function call within argument list) 【发布时间】:2016-04-21 18:52:07 【问题描述】:

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

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

fact 的函数原型是:

int fact(int);

定义是:

int fact(num=(num>1)?num*fact(num-1):1)

return num;

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

【问题讨论】:

你不能在 C 中做到这一点。 【参考方案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

【讨论】:

【参考方案2】:

你想要这个:

int fact(int num)

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

【讨论】:

谢谢,我理解使用递归来做到这一点,但我的问题是关于从论点本身实现它。我的目标是确保控件只进入函数一次。【参考方案3】:

这里有一些方法可以做到[它们将编译成几乎相同的——除了非递归版本]:

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

我应该提一下,非递归版本的执行速度会更快。忽略 large 阶乘可能会溢出int(即long long 可能是更好的选择),在递归版本上尝试fact(100000000),您很可能会因堆栈溢出而出现段错误.但是,非递归的会处理得很好。

【讨论】:

第一个会因为缺少分号而出现语法错误。 我的错。奖励:我添加了一个非递归版本 [处理 0]

以上是关于使用参数递归的数字阶乘(如参数列表中的函数调用)的主要内容,如果未能解决你的问题,请参考以下文章

C++用面向对象的方法求阶乘

递归函数

函数——基本语法,嵌套匿名高阶递归函数

JavaScript-函数(调用参数returnarguments匿名回调递归函数)函数案例

递归函数详解

JS函数递归