具有两个参数的算法因子函数(n,m)

时间:2014-02-16 21:47:29

标签: algorithm mergesort

我正在解决我的家庭作业并且无法理解问题,请向我解释这个问题,以便我可以解决问题。 问题是。

  • 编写一个递归函数,使用divide和来计算阶乘 在Merge-Sort中征服。也就是说,假设n m,写一个函数 因子(n,m)计算n(n-1)(n-2)···(m + 1)m。该 最高级别的电话将是Factorial(n,1)。

通过以下方式帮助我理解问题: -

  1. 为什么阶乘函数中有两个参数?
  2. 如果我理解,如果我选择n = 8,m = 5,执行将如同我理解的那样只执行8x7x6x5?这是对的吗?
  3. 据我所知,解决了阶乘的方法。迭代和递归。它们只接受1个数字的输入,即Factorial(n)来计算n的值。 ?解释如何开始。
  4. **

4 个答案:

答案 0 :(得分:3)

与合并排序类似:

function EvalFact(x, y) {
    return x * y;
}

function Factorial(m, n) {
    z = m;
    If (m != n) {
        p = floor((n - m) / 2); //(integer division)
        x = Factorial(m, m + p);
        y = Factorial(m + p + 1, n);
        z = EvalFact(x, y);
    } 
    return z;
}

致电因子(1,n)

答案 1 :(得分:2)

关键字是“分而治之”。这样你就可以计算20!将任务分为1到10,其次是11到20,然后将产品从11到20分成产品11..15和16..20。等

为什么你会这样做并不是那么清楚,因为乘法的数量不会改变。您可以在“大整数”场景中平衡因子的位长。

答案 2 :(得分:2)

答案很简单,Factorial(n,m)不应该对用户可见......

通常,为了编写一些递归逻辑,你需要将一些额外的状态传递给以后的方法调用...但是你总是可以从用户视图中隐藏这个方法,并使用一个参数从Factorial方法调用

答案 3 :(得分:1)

如果我说对了...用javaScript编写这个递归函数可能是这样的......
版本1 (顶级电话是Factorial(n,1)):

function Factorial(n,m) {
  if (m>1) {
    return Factorial(n, 1) / Factorial(m-1, 1);
  } else {
    if (n>1) {
      return n * Factorial(n-1, 1);
    } else {
      return 1;
    }
  }
}

但是这个 - 更简单的版本2 也可以使用:

function Factorial(n,m) {
  if (n>m) {
    return n * Factorial(n-1, m);
  } else {
    return m;
  }
}

版本3 分而治之:

function factorial(n, m) {
  if (n == m) {
    return n;
  } else {
    if (m > n) {
      return 1;
    } else {
      return factorial(n, Math.round((n+m)/2) ) * factorial( Math.round((n+m)/2)-1 , m);
    }
  }
}