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

関数 f(x, y) を「y が0なら x を返し、そうでなければ f(y, x mod y) を返す」と定義する。f(84, 36) を呼んだときの戻り値と、f が呼ばれる回数(最初の呼び出しを含む)の組はどれか。

  1. A戻り値12、呼ばれる回数3回
  2. B戻り値12、呼ばれる回数4回
  3. C戻り値6、呼ばれる回数3回
答えと解説を見る

正解:A. 戻り値12、呼ばれる回数3回

f(84, 36) は 84 mod 36 = 12 なので f(36, 12) を呼び、36 mod 12 = 0 なので f(12, 0) を呼び、y が0なので12を返します。呼び出しは f(84, 36)、f(36, 12)、f(12, 0) の3回で、これはユークリッドの互除法による最大公約数の計算です。この関数は再帰呼び出しの結果をそのまま返す末尾再帰なので、コンパイラが末尾呼び出しの最適化を行えばループに変換でき、呼び出しが深くなってもスタックを使い続けません。

  • A. 正しい。f(84, 36)→f(36, 12)→f(12, 0) の3回で、84と36の最大公約数12を返します。
  • B. f(12, 0) で y が0になった時点で終わるので、4回目の呼び出しはありません。
  • C. 84と36の最大公約数は12です(84 = 12×7、36 = 12×3)。
この分野を解く 分野ページへ

関連する計算ツール

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

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

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

  1. フィボナッチ数を求める関数 fib(n) を「n が1以下なら n を返し、そうでなければ fib(n−1) + fib(n−2) を返す」と再帰で定義した。fib(5) を呼んだとき、fib が呼ばれる回数は最初の呼び出しを含めて何回か。
  2. 1円、4円、6円の3種類の硬貨で8円を支払う。大きい硬貨から使えるだけ使う貪欲法で決めたときの枚数と、最少の枚数の関係として正しいものはどれか。
  3. 容量8のナップサックに、(重さ, 価値) が (2, 3)、(3, 4)、(4, 5)、(5, 6) の4つの品物から選んで入れる。各品物は1つずつしかなく、分割できない。重さの合計が8以下で、価値の合計の最大値はいくらか。
  4. 文字列の中からパターンを探すBM法(ボイヤー・ムーア法)の特徴として正しいものはどれか。
  5. 可変長配列で、容量が満杯のときに要素を追加すると、2倍の容量の領域を新たに確保して全要素をコピーする。容量1の空の配列に要素を1つずつ1,000個追加したとき、コピーされる要素の総数はいくつか。