Python漢諾塔問題

  1. 漢諾塔問題是一個經典的問題。漢諾塔(Hanoi Tower),又稱河內塔,源於印度一個古老傳說。大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序從新擺放在另外一根柱子上。而且規定,任什麼時候候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應該如何操做?

 

將其問題分解尋找規律python

  1. b柱子做爲輔助,把a上的63個圓盤移動到b
  2. a上最後一個圓盤移動到c
  3. a做爲輔助,把b上的62個圓盤移動到a
  4. b上的最後一個圓盤移動到c
  5. 即每次都是先將其餘圓盤移動到輔助柱子上,並將最底下的圓盤移到c柱子上,而後再把原先的柱子做爲輔助柱子,並重復此過程。

    著名的斐波那契數列定義以下,能夠看出,f(n)是由規模更小一些的f(n-1)和f(n-2)推導出來的:app

    f(0)=0,f(1)=1
    f(n)=f(n-1)+f(n-2) (n>=2)ide

    所以,遞歸實際上就是用本身來定義本身。函數

    這個過程稱爲遞歸,即定義一組基本操做,這組操做將規模小一點(或大一點)的操做當作一個總體——無需關心它的細節,只當它已經完成了——而後執行剩下的操做。而在更小或更大的規模中也依此操做,直到規模達到預約值。spa

    2.根據規律建立函數

    咱們假設函數func(n, a, b, c)用於將n個圓盤由a移動到cb做爲輔助柱子。那麼咱們能夠這樣實現這個遞歸過程:blog

    1. func:  
    2. if n!=0 then            ;預約值  
    3.   func(n-1, a, c, b)    ;n-1個盤子由a移動到b,以c爲輔助柱子(注意參數順序)  
    4.   move a[n] to c        ;a上的最後一個盤子移動到c  
    5.   func(n-1, b, a, c)    ;n-1個盤子由b移動到c,以a爲輔助柱子  
    6. endif                   ;完成  

    3.結合turtle構建函數

    1. import turtle  
    2.     
    3. class Stack:  
    4.     
    5.     def __init__(self):  
    6.     
    7.         self.items = []  
    8.     
    9.     def isEmpty(self):  
    10.     
    11.         return len(self.items) == 0  
    12.     
    13.     def push(self, item):  
    14.     
    15.         self.items.append(item)  
    16.     
    17.     def pop(self):  
    18.     
    19.         return self.items.pop()  
    20.     
    21.     def peek(self):  
    22.     
    23.         if not self.isEmpty():  
    24.     
    25.             return self.items[len(self.items) - 1]  
    26.     
    27.     def size(self):  
    28.     
    29.         return len(self.items)  
    30.     
    31.      
    32.     
    33. def drawpole_3():  
    34.     
    35.     t = turtle.Turtle()  
    36.     
    37.     t.hideturtle()  
    38.     
    39.     def drawpole_1(k):  
    40.     
    41.         t.up()  
    42.     
    43.         t.pensize(10)  
    44.     
    45.         t.speed(100)  
    46.     
    47.         t.goto(400*(k-1), 400)  
    48.     
    49.         t.down()  
    50.     
    51.         t.goto(400*(k-1), -100)  
    52.     
    53.         t.goto(400*(k-1)-20, -100)  
    54.     
    55.         t.goto(400*(k-1)+20, -100)  
    56.     
    57.     drawpole_1(0)  
    58.     
    59.     drawpole_1(1)  
    60.     
    61.     drawpole_1(2)  
    62.     
    63.      
    64.     
    65. def creat_plates(n):  
    66.     
    67.     plates=[turtle.Turtle() for i in range(n)]  
    68.     
    69.     for i in range(n):  
    70.     
    71.         plates[i].up()  
    72.     
    73.         plates[i].hideturtle()  
    74.     
    75.         plates[i].shape("square")  
    76.     
    77.         plates[i].shapesize(1,20-i)  
    78.     
    79.         plates[i].goto(-400,-90+20*i)  
    80.     
    81.         plates[i].showturtle()  
    82.     
    83.     return plates  
    84.     
    85.      
    86.     
    87. def pole_stack():  
    88.     
    89.     poles=[Stack() for i in range(3)]  
    90.     
    91.     return poles  
    92.     
    93.      
    94.     
    95. def moveDisk(plates,poles,fp,tp):  
    96.     
    97.     mov=poles[fp].peek()  
    98.     
    99.     plates[mov].goto((fp-1)*400,550)  
    100.     
    101.     plates[mov].goto((tp-1)*400,550)  
    102.     
    103.     l=poles[tp].size()  
    104.     
    105.     plates[mov].goto((tp-1)*400,-90+20*l)  
    106.     
    107.      
    108.     
    109. def moveTower(plates,poles,height,fromPole, toPole, withPole):  
    110.     
    111.     if height >= 1:  
    112.     
    113.         moveTower(plates,poles,height-1,fromPole,withPole,toPole)  
    114.     
    115.         moveDisk(plates,poles,fromPole,toPole)  
    116.     
    117.         poles[toPole].push(poles[fromPole].pop())  
    118.     
    119.         moveTower(plates,poles,height-1,withPole,toPole,fromPole)  
    120.     
    121.      
    122.     
    123. myscreen=turtle.Screen()  
    124.     
    125. drawpole_3()  
    126.     
    127. n=int(input("請輸入漢諾塔的層數並回車:\n"))  
    128.     
    129. plates=creat_plates(n)  
    130.     
    131. poles=pole_stack()  
    132.     
    133. for i in range(n):  
    134.     
    135.     poles[0].push(i)  
    136.     
    137. moveTower(plates,poles,n,0,2,1)  
    138.     
    139. myscreen.exitonclick()  

    4.將該代碼輸入python並運行

    運行過程以下圖遞歸

 

 

相關文章
相關標籤/搜索