Entry

入社試験の問題をつらつら考えた

2010年02月13日

下っ端にはぜんぜん知らされていなかったんですけれど,どうも職場で「人を入れよう」な話になっているらしく,選考試験を考えることになりました。うちの職場は規模が小さいので,選考試験も手作り。手間はかかるんですけど,SPI みたいに機械的に人を切るよりはマシだと思っています。

つことで,「なんか適当なのを考えてよ」と言われてたのでした。で,以下がいくつか考えたうちのひとつ。他の問題は割と専門的なので,一般的なプログラマ向けのものを。少なくともうちの基準ですけれど,「プログラミングできます」と他人に言うための必要最低条件という位置づけです。

【問題】
次の C++ で書かれたプログラムについて,以下の設問に答えてください。

#include <iostream>

int
factor(int n) {
  return (n > 0) ? n * factor(n - 1) : 1;
}

int
main(int argc, char* argv[]) {
  int n = factor(5);
  std::cout << n << std::endl;
  return 0;
}

[設問]

  1. このプログラムを実行した結果を20文字程度で答えてください。
  2. 関数 factor を for-文を使った関数に書き直してください。
  3. 2. で書き直した関数と元の関数 factor を比較した場合,処理効率の点でどのような違いがありますか。100文字程度で答えてください。
  4. 関数 factor を,引数の階乗を計算する関数とした場合,機能要件の点から制限と考えられる条件があります。この制限を考えられるだけ挙げてください。また,この制限を排除するには,このプログラムをどのように修正する必要がありますか。併せて答えてください(修正できない場合は「修正不可」と記述し,その理由を答えてください)。

よくある再帰のプログラム。これ自体は見ている人も多いはず。どんなアルゴリズム本にも書かれてますしね。もっとも,C++ で再帰のプログラムを実装すると,このプログラムは潜在的な問題を孕むことになります。この問題をしっかり認識しているか(あるいはその場で考えられるか)ということを聞きたかったのでした。偉そうなんですが。

このサイトでは以前にも書いたけれども,再帰のプログラムは関数呼び出しのコストとスタックサイズの影響を大きく受けます。これは,C++ だけでなく,Java でも C# でも同じ。単純にパフォーマンス(と可読性)だけで考えるならば,階乗計算を再帰で書く必要性はほとんどありません。この点について適切に書かれていれば合格点としました。重ね重ね,偉そうなんですが。

ちと分野を絞っちゃったんだけれども,それなりに「簡単そうで骨のある問題」になったんじゃないかと思います。何かの参考にどうぞ(何の参考だか分からんけど)。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN