ハノイの再帰と非再帰アルゴリズムの塔

ハノイの再帰と非再帰アルゴリズムの塔

次のようにハノイ問題のタワーが記載されています:

有 A、B、C 3 根针,n 个圆盘(从 1..n )从上到下,按小到大顺序放在 A 处,要求每次移动一个,并保持从小到大的叠放顺序,
利用 C,把 n 个盘子移动到 B 处。

再帰的アルゴリズム

再帰的なアルゴリズムを理解しやすいです

fn hanoi(n):
    hanoi_move(n, 'A', 'B', 'C')

fn hanoi_move(n, from, to, medium):
    if n <= 0:
        return
    hanoi_move(n-1, 'A', 'C', 'B')
    println("move {} from {} to {}", n, from, to);
    hanoi_move(n-1, 'C', 'B', 'A')

非再帰的なアルゴリズム

場合N AからBへの処理においては、全体の動きを再考、N-1個のディスクの数nまで左にC、Aからディスクをその上に対処する必要性を、この手順が定義されていますステップのために:

struct Step {
    n, r, from, to, medium
}

N rは現在の数がさらにどのように多くのディスク、ときにその上に配置され表すr:1である、すなわち、n個のディスク番号を移動させることができます

Step(n, r, from, to, medium) 分解为
1. Step(r-1, r-1, from, medium, to)
2. Step(n, 1, from, to, medium)
3. Step(r-1, r-1, medium, to, from)

分解は、スタックと貯蔵中の分解の方向とは反対方向に注意完了するまで、双方向スタックやキューを利用することができ、中間状態を保持します。

fn hanoi_move_stack(n, from, to, medium):
    if n <=0:
        return
    s = Stack()
    s.push(Step(n, n, from, to, medium)):
    while !s.is_empty():
        step = s.pop()
        if step.r == 1:
            println("move {} from {} to {}", step.n, step.from, step.to)
        else:
            s.push(Step(step.r-1, step.r-1, step.medium, step.to, step.from))
            s.push(Step(step.n, 1, step.from, step.to, step.medium))
            s.push(Step(step.r-1, step.r-1, step.from, step.medium, step.to))

おすすめ

転載: www.cnblogs.com/fengyc/p/11735845.html