【发布时间】:2012-03-18 05:14:22
【问题描述】:
我们被赋予了一项简单的任务,以最有效的方式分别使用递归和迭代来计算起点和终点(“from”和“to”)之间的所有数字,而无需使用明显的公式这将是 O(1)。
没有应用程序,我只是好奇和挑战,看看我的解决方案是否可以比现有的更多改进/完善:
/* recursion */
unsigned int sum1(unsigned int from, unsigned int to) {
if (to - from < 2)
return from + (from == to ? 0 : to);
else
return from + to + sum1(from + 1, to - 1);
}
/* iteration */
unsigned int sum2(unsigned int from, unsigned int to) {
int p = to - from;
if (p == 0) return from;
int i, s, n = p / 2;
if (p % 2 == 0) s = n + from;
else {
s = 0;
n++;
}
for (i = 0; i < n; i++) {
s += from++ + to--;
}
return s;
}
【问题讨论】:
-
这是多么愚蠢的任务!就像“做一个三明治,但你不能用刀,只能用剑,自己种牛,用它的奶在面包上涂黄油”……
-
Carbonic Acid,为什么讨厌试图让一个班级按照派生其他有用算法需要你思考的方式思考?这只是一个简单的练习来实践这个概念。
-
@AlexReynolds,它根本不是重复的,因为另一个问题对欧几里得算法的使用是开放的。
-
你如何定义效率?
-
@user112358132134 我不认为他在这样做。他做了一个尝试。现在,他只需要有关如何改进他的方法的反馈和建议。我看不出有什么问题。