問題 #19 ・ 再帰 ・ 難易度 4
次のプログラム中の〔 a 〕と〔 b 〕に入れる引数の適切な組合せを、選択肢の中から選べ。 手続 hanoi は、ハノイの塔における円盤の移動手順を大域の配列 log に記録する。ハノイの塔とは、3本の杭があり、移動元の杭(src)にある n 枚の大きさがすべて異なる円盤を、次の規則に従って移動先の杭(dst)へすべて移動する問題である。作業用の杭(work)を補助として使うことができる。 ・1回に1枚の円盤だけを移動できる。 ・どの杭においても、小さい円盤の上に大きい円盤を置くことはできない。 hanoi(3, "A", "C", "B") を呼び出した後、log の内容は {"A→C", "A→B", "C→B", "A→C", "B→A", "B→C", "A→C"} となる。ここで、配列の要素番号は 1 から始まる。
大域: 文字列型の配列: log ← {}○hanoi(整数型: n, 文字列型: src, 文字列型: dst, 文字列型: work)if (n < 1)returnendifhanoi(〔 a 〕)log の末尾に src + "→" + dst を追加するhanoi(〔 b 〕)
ハノイの塔の再帰アルゴリズムは次の3段階で構成される。 (1) 上の n-1 枚を src から work へ移動する(dst を作業用として使う) (2) src に残った最大の円盤を dst へ移動する(1回の移動) (3) work にある n-1 枚を dst へ移動する(src を作業用として使う) したがって、 ・〔 a 〕= n - 1, src, work, dst(段階1に対応) ・〔 b 〕= n - 1, work, dst, src(段階3に対応) が正解である。 【トレース: hanoi(3, "A", "C", "B")】 hanoi(3,A,C,B) hanoi(2,A,B,C) … 上2枚をAからBへ hanoi(1,A,C,B) … 上1枚をAからCへ hanoi(0,...) → return log追加: "A→C" … log[1] hanoi(0,...) → return log追加: "A→B" … log[2] hanoi(1,C,B,A) … 上1枚をCからBへ hanoi(0,...) → return log追加: "C→B" … log[3] hanoi(0,...) → return log追加: "A→C" … log[4](最大円盤の移動) hanoi(2,B,C,A) … 上2枚をBからCへ hanoi(1,B,A,C) … 上1枚をBからAへ hanoi(0,...) → return log追加: "B→A" … log[5] hanoi(0,...) → return log追加: "B→C" … log[6] hanoi(1,A,C,B) … 上1枚をAからCへ hanoi(0,...) → return log追加: "A→C" … log[7] hanoi(0,...) → return 結果: log = {"A→C", "A→B", "C→B", "A→C", "B→A", "B→C", "A→C"} これは問題文に示された期待結果と一致する。
登録なしで解ける問題は、これで最後です。続きは無料登録で、演習用の300問を期限も上限もなく解けます。登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。