我正在解决我的家庭作业并且无法理解问题,请向我解释这个问题,以便我可以解决问题。 问题是。
通过以下方式帮助我理解问题: -
**
答案 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);
}
}
}