【发布时间】:2012-06-25 15:56:53
【问题描述】:
我在完成 Euler 项目时遇到了一个组合问题。组合逻辑意味着计算阶乘。所以,我决定创建一个阶乘方法。然后我遇到了一个问题——因为我可以很容易地使用迭代和递归来做到这一点,我应该选择哪一个?我很快写了 2 个方法 - 迭代:
public static long factorial(int num) {
long result = 1;
if(num == 0) {
return 1;
}
else {
for(int i = 2; i <= num; i++) {
result *= i;
}
return result;
}
和递归:
public static long factorial(int num) {
if(num == 0) {
return 1;
}
else {
return num * factorial(num - 1);
}
}
如果我(显然)在这里谈论速度和功能,我应该使用哪一个?而且,总的来说,其中一种技术通常比另一种更好(所以如果我以后遇到这种选择,我应该选择什么)?
【问题讨论】:
-
@luketorjussen - 因为我处理的数字很少,而且由于我只调用该方法一两次,我不会注意到差异。我在说的是,如果我使用这种方法会加载和加载多次,或者是可以使用这两种技术的更复杂的方法。
-
你为什么不同时尝试一下,看看哪个更快?你也不需要去检查如果
num == 0,如果num == 1那么你可以返回1,为什么要额外的迭代/函数调用 -
@Bluefire,那么为什么不尝试使用大数字并多次调用它呢?
-
迭代版本似乎过于复杂。可以简化为
int res = 1; for (int i = 2; i <= num; ++i) res *= i; return res;