再帰呼び出し--ハノータ

1444 ワード

学習ノートから
def move(n,a,b,c):
    if n ==1:
        print('move',a,'-->',c)
        return
    move(n-1,a,c,b)
    print('move',a,'--->',c)
    move(n-1,b,a,c)

move(3,'A','B','C')

出力はmove A->C move A->B move C->B move A->C move B->A move B->C move A->C
(1)再帰的な内包を理解しなければならない.再帰関数を定義するときは、この再帰関数の役割を理解しなければなりません.例えば、この問題においてmove(n,a,b,c)は、n個のディスクがaからbの助けによってcに移動する必要があることを意味する.また,ここで2,3,4番目のパラメータは変数であり,柱の名前を表す.move(5,m,n,k)は3つの柱を代表してそれぞれm,n,kと呼ばれ、5つの皿をmからnを通ってkに移動する必要があります.
(2)ここでは上部のn-1個の皿を1つの全体と見なすことができ,この問題は2個の皿の問題を解決すれば,当然3ステップでよいとなる.このうちn−1個の皿を全体と見なしているため,このn−1個の皿を操作するたびに再帰関数を用いる.n-1個の皿が勝手に動くわけではないからです.これが再帰関数を使うタイミングです
(3)なぜ底のn-1皿を全体として動かさないのかと聞かれるかもしれません.これはハンノタのルールが制限されているため、小皿は大皿の上に置かなければならない.底のn-1皿を全体として再帰操作すると、このルールに違反していることがわかりますので、お勧めしません