tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

1から10まで足す話

相変わらず面白いなぁ(悪い意味で)

ベンチャー社長で技術者で: 「転職活動する暇があったらブログを書け」について

SQLはさておき、弊社の入社試験に、「1から10までの自然数の合計を出すプログラムを書きなさい」というのがあるのですが、ほとんどの人はループで書けていた。足し算だからかな?ちなみに、もちろんわたしが望んでいる答えは、ガウスが8歳だか、10歳だかにあみ出したというあのやり方で、まぁ、いわゆる引っ掛け問題です。今まで正解者はいない(苦笑)

どう考えても、

return 55;

が正解だと思うけどね。この仕様でいいのなら。シンプルかつ高速だから。で、コメントでこんなこと言ってるの。

クイズとか試験ってのは言葉遊びみたいなところがあり、大手とか官僚はそういう能力を尊ぶところはあるでしょうが、一般社会ではそれではダメで、意図がまったく読み取れてないからゼロです。
客先で言葉遊びを始められるととっても困るので、そういうのはいらない。

いやいや、だったらちゃんとお客さんと仕様をつめなきゃ駄目でしょう。なんで「等差数列でいい」って決めれるのさ。もしかしたら一般項を関数リファレンスで渡してどんな数列の和でも取れなきゃ駄目って仕様かもしれない。

仕様を詰めずに過剰な実装を行うのは、システム屋さんとしては絶対やっちゃいけないことだと思うんだけど。

あとね、ループってそんなに悪くないんだよね。いわゆる O(n) だから。二重以上のループならアルゴリズム変えてチューニングする価値はあるけど、よほどクリティカルな部分じゃなければシンプルな実装の方がいいと思う。

あるいは本当にクリティカルでスピード命なら、配列かハッシュを用意して事前に計算した値を突っ込んでおいてそれを返すってのもアリか。大きな数を計算するためにはメモリがいっぱいいるけどね。

ちなみに、1〜10までの和をループを使わずに書くのが一部で流行しているらしいです。一番面白かったのはコレ(↓)
1から10までの自然数の合計を出すプログラムをプリプロセッサを使って書きなさい - 危ないRiSKのブログ うつ期ver.

オイラも遊びで一個書いてみた。再帰

use Test::More;

is( sum(1, 10), 55 );
is( sum(1, 2), 3 );

sub sum {
  my($begin, $end, $sum) = @_;
  $sum += $begin;
  return $sum if ( $begin == $end );
  return sum( $begin + 1, $end, $sum );
}

done_testing();

# 再帰が遅いってことはもちろん知ってます。