果報は寝て待て: 8月 2020

2020年8月11日火曜日

60の手習い 〜python勉強中〜

pythonを勉強中、再帰法の題材にでてくる、ハノイの塔 のプログラムがどうしても理解できません。

演習問題で、「ハノイの塔をタートルで動かせ」とありましたのでなんとか動かしてみました。

 

 コードを入力

  1. import turtle
  2. wn = turtle.Screen()
  3. t1 = turtle.Turtle()
  4. t1.resizemode("user")
  5. t1.shapesize(1,1,1)
  6. t1.shape("circle")
  7. t1.color("red")
  8. t1.speed(3)
  9. t1.up()
  10. t1.setpos(0,180)
  11.  
  12. t2 = turtle.Turtle()
  13. t2.resizemode("user")
  14. t2.shapesize(1,2,1)
  15. t2.shape("circle")
  16. t2.color("green")
  17. t2.speed(3)
  18. t2.up()
  19. t2.setpos(0,150)
  20.  
  21. t3 = turtle.Turtle()
  22. t3.resizemode("user")
  23. t3.shapesize(1,3,1)
  24. t3.shape("circle")
  25. t3.color("brown")
  26. t3.speed(3)
  27. t3.up()
  28. t3.setpos(0,120)
  29.  
  30. t4 = turtle.Turtle()
  31. t4.resizemode("user")
  32. t4.shapesize(1,4,1)
  33. t4.shape("circle")
  34. t4.color("black")
  35. t4.speed(3)
  36. t4.up()
  37. t4.setpos(0,90)
  38.  
  39. t5 = turtle.Turtle()
  40. t5.resizemode("user")
  41. t5.shapesize(1,5,1)
  42. t5.shape("circle")
  43. t5.color("yellow")
  44. t5.speed(3)
  45. t5.up()
  46. t5.setpos(0,60)
  47.  
  48. t6 = turtle.Turtle()
  49. t6.resizemode("user")
  50. t6.shapesize(1,6,1)
  51. t6.shape("circle")
  52. t6.color("pink")
  53. t6.speed(3)
  54. t6.up()
  55. t6.setpos(0,30)
  56.  
  57. t7 = turtle.Turtle()
  58. t7.resizemode("user")
  59. t7.shapesize(1,7,1)
  60. t7.shape("circle")
  61. t7.color("cyan")
  62. t7.speed(3)
  63. t7.up()
  64. t7.setpos(0,0)
  65.  
  66. t8 = turtle.Turtle()
  67. t8.resizemode("user")
  68. t8.shapesize(1,8,1)
  69. t8.shape("circle")
  70. t8.color("violet")
  71. t8.speed(3)
  72. t8.up()
  73. t8.setpos(0,-30)
  74.  
  75.  
  76. def move_turtle(t_num,to_pole):
  77. if t_num ==1 :
  78. t_num = t1
  79. if t_num ==2 :
  80. t_num = t2
  81. if t_num ==3 :
  82. t_num = t3
  83. if t_num ==4 :
  84. t_num = t4
  85. if t_num ==5 :
  86. t_num = t5
  87. if t_num ==6 :
  88. t_num = t6
  89. if t_num ==7 :
  90. t_num = t7
  91. if t_num ==8 :
  92. t_num = t8
  93.  
  94. count_a = 0
  95. count_b = 0
  96. count_c = 0
  97. for t in (t1,t2,t3,t4,t5,t6,t7,t8):
  98. if t.xcor() == 0:
  99. count_a = count_a + 1
  100. if t.xcor() == 150:
  101. count_b = count_b + 1
  102. if t.xcor() == 300:
  103. count_c = count_c + 1
  104. to_a_y = count_a * 30 - 30
  105. to_b_y = count_b * 30 - 30
  106. to_c_y = count_c * 30 - 30
  107. if to_pole =="A":
  108. t_num.sety(200)
  109. t_num.setx( 0)
  110. t_num.setpos(0 ,to_a_y)
  111. if to_pole =="B":
  112. t_num.sety(200)
  113. t_num.setx(150)
  114. t_num.setpos(150 ,to_b_y)
  115. if to_pole =="C":
  116. t_num.sety(200)
  117. t_num.setx(300)
  118. t_num.setpos(300 ,to_c_y)
  119.  
  120. def moveTower(height,fromPole, toPole, withPole):
  121. if height >= 1:
  122. moveTower(height-1,fromPole,withPole,toPole)
  123. moveDisk(height,fromPole,toPole)
  124. moveTower(height-1,withPole,toPole,fromPole)
  125.  
  126. def moveDisk(height,fp,tp):
  127. print("moving disk",height," from",fp,"to",tp)
  128. move_turtle(height,tp)
  129.  
  130. moveTower(8, "A", "C", "B")
  131.  
  132.  
  133. wn.exitonclick()
  134.  

8段まで動かしてイメージを作ってます。

じっくり眺めてても古い頭ではなかなか理解できません。