データ構造とアルゴリズム

フィボナッチ数を求める関数 fib(n) を「n が1以下なら n を返し、そうでなければ fib(n−1) + fib(n−2) を返す」と再帰で定義した。fib(5) を呼んだとき、fib が呼ばれる回数は最初の呼び出しを含めて何回か。

  1. A6回
  2. B9回
  3. C15回
答えと解説を見る

正解:C. 15回

fib(n) の呼び出し回数を C(n) とすると、C(0) = C(1) = 1、C(n) = 1 + C(n−1) + C(n−2) なので、C(2) = 3、C(3) = 5、C(4) = 9、C(5) = 15 です。同じ値を何度も計算し直すため、回数は n に対して指数関数的に増え、fib(30) では約269万回になります。計算した値を表に覚えておくメモ化(動的計画法)を使えば、計算は fib(0)〜fib(5) の6通りで済み、呼び出しも9回(2n − 1)に減ります。6回は異なる引数の数、9回はメモ化した場合の呼び出し回数です。

  • A. 異なる引数 fib(0)〜fib(5) の数で、同じ値の再計算を数えていません。
  • B. メモ化して、一度計算した値を表から返す場合の呼び出し回数です。
  • C. 正しい。C(n) = 1 + C(n−1) + C(n−2) から、C(5) = 15 です。
この分野を解く 分野ページへ

関連する計算ツール

データ構造とアルゴリズムの参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

データ構造とアルゴリズムのほかの問題

  1. 1円、4円、6円の3種類の硬貨で8円を支払う。大きい硬貨から使えるだけ使う貪欲法で決めたときの枚数と、最少の枚数の関係として正しいものはどれか。
  2. 容量8のナップサックに、(重さ, 価値) が (2, 3)、(3, 4)、(4, 5)、(5, 6) の4つの品物から選んで入れる。各品物は1つずつしかなく、分割できない。重さの合計が8以下で、価値の合計の最大値はいくらか。
  3. 文字列の中からパターンを探すBM法(ボイヤー・ムーア法)の特徴として正しいものはどれか。
  4. 可変長配列で、容量が満杯のときに要素を追加すると、2倍の容量の領域を新たに確保して全要素をコピーする。容量1の空の配列に要素を1つずつ1,000個追加したとき、コピーされる要素の総数はいくつか。
  5. 要素数が多く、負荷率を0.5程度に保ったハッシュテーブルで、線形探査のオープンアドレス法が、チェイン法(連結リストでつなぐ方法)より速くなりやすい理由として最も適切なものはどれか。