平成20年 秋期 基本情報技術者 午前 問14
n の階乗を再帰的に計算する関数F (n )の定義において、aに入れるべき式はどれか。
ここで、n は非負の整数である。
n >0のとき、F (n )=| a |
n =0のとき、F (n )=1
| ア | n +F (n −1) | イ | n −1+F (n ) | ||
| ウ | n ×F (n −1) | エ | (n −1)×F (n ) |
【キーワード】
・再帰的処理
【キーワードの解説】
- 再帰的処理(recursive)
処理(関数)の中で自分自身の処理を呼び出すことです。
再帰を使用することで、処理を単純に表すことができます。
再帰的処理を使った階乗の計算式について問題です。
再帰的処理の解説にも書きましたが、再帰的処理を使うと処理を単純に表すことができます。ソフトウェアを開発する上でこの“単純化”というのは不具合(バグ)を減らすためには非常に重要なので、再帰的処理は便利です。
ただ、再帰的処理も万能ではなく、再帰的に関数の呼び出しを行うと、スタックにそのときの状態(CPUのレジスタの値)が格納(退避)されるため、再帰呼び出し回数が多くなるとスタックを使い切ってしまいエラーが発生することがあります。
プログラムのデバッグ、テストでは扱うデータが少ないのでバグとして見つからないのが、運用を開始して扱うデータが徐々に多くなり、突然エラーということもありますので、再帰的処理を使うときには設計(スタック容量)に気をつけないといけません。(1年以上も安定して動作していた再帰的プログラムが、ある時からバグだらけになった経験あり。)
また、再帰的処理はプログラムの構造が単純になるため処理速度も速いと思われがちですが、再帰呼び出し時のスタックへの退避処理がメモリアクセスなので時間がかかり、思ったほど速くないことが多いです。(例、再帰的処理ではクイックソートが有名ですが、実際に他のソートと比較して突出して早くはないです。)
スタック領域のあふれ(オーバーフロー)はメモリ保護機能のあるシステム(OS)では、OSがエラー出してくれますが、メモリ保護のないシステムの場合、メモリの内容を書き換えて(破壊して)しまうため、不具合の現象が毎回異なったりして、デバッグ(解析)が非常に大変です。しかも、対策として「十分なスタック容量を準備する」という方法しかないため、再発防止策としての説得力がなく、ソフトウェア開発における課題の一つですね。そのため企業によっては『再帰的処理は使用禁止』にしているところもあるようです。
なお、再帰的処理を使う場合の『適切なスタック容量』を設計時に求めることはできないと思います。
情報処理技術者試験の勉強をやり直しの、平成20年秋期の基本情報技術者、ソフトウェア開発技術者の問題の解説は週に各10問のペースで追加予定です。(毎週水曜日に公開予定。残り10問なので来週で最後です。)
また、キーワード分類のも更新します。
私は来春の試験で『情報セキュリティスペシャリスト』を受験しようと考えています。



