Pythonで実装されたハノイタワーの再帰アルゴリズムの古典的なケース

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府
学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,所以本人觉得可以写篇博客来表达一下自己的见解。这markdown编辑器还不怎么会用,可能写的有点格式有点丑啦,各位看官多多见谅.

ハノイ、ハノイの塔の塔の絵を見つけるためにインターネットで注文スタックを降順で一番左の列の真ん中の列でディスクを使用することで、それが元保つCと同じ意味ここに画像の説明を挿入
 のカットにがらくたを、まずコードを点灯します

def move(n, a, buffer, c):
  if(n == 1):
    print(a,"->",c)
    return
  move(n-1, a, c, buffer)
  move(1, a, buffer, c)
  move(n-1, buffer, a, c)
move(3, "a", "b", "c")

1つ目は、移動関数を定義することです。4つのパラメーターは、a列のプレートの数を表し、バッファーはb列です。このバッファーは、わかりやすいようにbufferという名前です。名前が示すように、aからcに移動するのはバッファーです。次にcがターゲットです列
関数コードの
 再帰の一般的な記述を読んでみましょう。再帰サイクルを停止するための条件が必要です。そのため、列のプレートの数が1であると判断すると、再帰を停止して戻ることができます。 aからcに移動しました。重要なポイントは次のコードです。再帰は実際には非常に抽象的なアルゴリズムです。ハノイタワーの問題を考えるには、抽象的な思考を使用する必要があります。上の2列のプレートを考えてください。下部プレートと下部プレート(表示されここに画像の説明を挿入
  ている場合)上部にプレートがいくつあるかは関係ありません。すべての操作は、下部プレートをバッファーbカラムバッファーからcカラムに移動することです。
 子供の靴はなぜソースを動かしたいのかを考えている必要があります。実際、これは要約です。自分でHanotaゲームをプレイすると、ルールがわかります。実際、このゲームは、上記のすべての方法を使用して、 b、次にaからcの最後の1つを取得し、頭を悩ませてbをcに移動します。このとき、bのオリジナルも空のaを介して保存する必要があることがわかります。 bの上のn-1、そして最後の最大のbをcに移動します。ここで法則が反映され、移動の方法を抽象化することもでき、これを使用してプログラムアルゴリズムを設計できます。
 抽象化を今すぐ使用しましょう残りのコードの解釈

move(n-1、a、c、buffer)

このコードは、n-1を列aの上に移動し、ルールに従って、cを介してバッファーバッファーに移動します。この関数は再帰に入ります。

move(1、a、buffer、c)

上記のステートメントの実行が完了すると、つまりn-1プレートの再帰的な移動が完了すると、このステートメントの実行により、aのプレートがいわゆるボトムプレートであるcに移動します。

move(n-1、buffer、a、c)

最後のステップは、aのn-1をバッファに移動することです。ハノイの塔全体の移動を完了するには、aからcに移動する必要があるため、最後のステップは、aのn-1を渡すことです。バッファーがCピラーに移動したら、
 移動プロセス全体を書き留めます。例として、Aピラーの3を取り上げます。

/**
我把3个盘子的汉诺塔全部通过代码演示,按缩进原则,每一个缩进即进一个递归函数,每打印一次即中止当前递归,也就是每个print
说明:
  1.n = 3, n = 2, n = 1是每次执行if(n == 1)的结果,这里就不写判断了,相信童鞋们也能看懂,也就是n不等与1时就减1进入递归
  2.请注意a,b,c柱每次进入函数的顺序,不要被形参带错路了,看准每次函数参数的实参 
**/
move(3, "a", "b", "c")
n=3:
  //开始从a上移动n-1即2个盘子通过c移动到b,以腾出c供a最后一个盘子移动
  move(2, "a","c","b")
  n=2:
  //开始进行n=2的一个递归,把当前a('a')柱上的n-1个盘子通过c('b')移动到b('c')
    move(1, "a", "b", "c")
    n=1:
    //n=2的第一个递归完成,打印结果,执行当前子函数剩余代码
      print("a", "->", "c") 
    move(1, "a", "c", "b")
    n=1:
      print("a", "->", "b")
    move(1, "c", "a", "b")
    n=1:
      print("c", "->", "b")
     //到这里完成了a柱上面的n-1即是2个盘子的移动
//开始把a柱上最后一个盘子移动到c柱上
move(1, "a", "b", "c")
n=1:
  print("a", "->", "c")
  //到这里完成移动a柱上的最后一个盘子到c柱上 
move(2, "b", "a", "c")
n=2:
//开始进行n=2的第二个递归,即把当前b('b')的盘子(n-1个)通过a('a')移动到c('c')上
  move(1, "b", "c", "a")
  n=1:
  //n=2 的第二个递归完成,打印结果并执行当前子函数的剩余代码
    print("b", "->", "a")
  move(1, "b", "a", "c")
  n=1:
    print("b", "->", "c")
  move(1, "a", "b", "c")
  n=1:
    print("a", "->", "c")
    //到这里把b上的盘子通过a移动到c,
//整个代码执行完毕,汉诺塔移动完成

最終的な印刷結果は次のとおりです。
ここに画像の説明を挿入
ハノイタワーの再帰アルゴリズムの原理を理解した後、子供用の靴はプログラムを書いて試すことができます。ここでは、Pythonの再帰を学習して、Pythonを使用して子供用の靴を他の言語で実装できるようにします。ハノイタワーこれは、再帰の原理を理解するのに非常に役立ちます。プログラミングにおける再帰の重要性は自明です。
読んでいただきありがとうございます
。大学でpythonを勉強することに決めたとき、私はコンピューターの基礎がよくなかったことがわかりました。私は学問の資格を持っていませんでした。これは
何もすることはできません。埋め合わせるしかできないので、コーディング以外で自分の反撃を始めました。道は、Pythonのコア知識を学び続け、コンピューターの基礎の詳細な研究を整理し、平凡になりたくない場合は、コーディングに参加して成長してください!
実は、ここには技術だけでなく、それ以外のものもあり、例えば「絹糸」というよりも、どうやってプログラマーとして絶妙な存在になるのか、プログラマー自体が高貴な存在ですね。[参加するにはクリックしてください]自分らしくなりたい、高貴な人になりたい、是非!

公開された34のオリジナル記事 いいね12 訪問者20,000以上

おすすめ

転載: blog.csdn.net/chengxun03/article/details/105477240