如何递归计算阶乘的阶乘?

时间:2015-02-18 09:03:02

标签: recursion data-structures computer-science

我遇到了以下问题: N是正非零整数,我必须计算:N*(N-1)^2*(N-2)^3*..*1^N的乘积。

到目前为止我的解决方案如下: N*myFact(N-1)*fact(N-1)

事情是我不允许使用任何帮助功能,例如'fact()'

编辑:数学上它可以表示如下:N!*(N-1)! (N-2)! .. * 1!

3 个答案:

答案 0 :(得分:0)

尝试:

int myFact(int n) {
  return n == 1 ? 1 : myFact(n-1)*n;
}

答案 1 :(得分:0)

我认为这需要用1个函数来完成,即你不能自己创建fact辅助函数。

您可以使用myFact(n-1) / myFact(n-2) == (n-1)!

这一事实
int myFact(int n)
{
    if (n == 0 || n == 1) {
        return 1
    } else {
        // (n - 1)!
        int previousFact = myFact(n - 1) / myFact(n - 2);
        return myFact(n - 1) * previousFact * n;
    }
}

答案 2 :(得分:0)

此功能称为superfactorial。递归实现是

long superFact(n) {
  if (n < 2) return 1;
  long last = superFact(n-1);
  long prev = superFact(n-2);
  return last * last / prev * n;
}

但效率非常低 - 需要大约3 * F(n)个递归调用来查找superFact(n),其中F(n)是第n个斐波纳契数。 (工作呈指数级增长。)