わかりやすい式を使用せずに、それぞれ再帰と反復を使用して開始点と終了点の間のすべての数値( 'from'と 'to')を合計する最も効率的な方法を思いつく簡単なタスクが与えられました。 O(1)になります。Sum(i ... j) - これにはより効率的な/エレガントなソリューションがありますか?
このためのアプリケーションがありませんが、私は単に好奇心と私の解決策は、それがすでにあるよりも多くの研磨/改善することができるかどうかを確認するために挑戦:
/* 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;
}
[最速加算番号が重複する可能性最大N](http://stackoverflow.com/questions/2624387/fastest-possible-summing-numbers-up-to-n) –
これはどのように愚かな種類のタスクです! 「サンドイッチを作っても、ナイフや刀だけではなく、自分の牛を育てることはできません。牛乳を使ってパンにバターを入れましょう」。 –
炭酸の酸、他の有用なアルゴリズムを導き出すには、あなたが考える必要があると思う方法を考えていますか?このコンセプトを実践するのは簡単な運動です。 – rtheunissen