九連環的遞迴解法

2021-10-01 14:14:59 字數 2038 閱讀 1710

最近在重溫資料結構和演算法分析。剛好手頭有個九連環,就想著用遞迴寫寫個九連環的解法。九連環解法的基本原則:

這三個簡單規則就構成了遞迴解法的基礎。

%matplotlib qt

import matplotlib.pyplot as plt

from matplotlib.patches import circle

# 模擬九連環,1表示在杆上,0表示不在

ring =[0

,1,1

,1,1

,1,1

,1,1

,1]up =

1down =

0steps =

0 fig = plt.figure(figsize=(12

,3))

defvisual

(steps,index,action)

:if action == up:

title =

'setp-%s: %s ring up'

%(steps,index)

else

: title =

'setp-%s: %s ring down'

%(steps,index)

plt.cla(

) ax = fig.add_subplot(

111)

plt.axis(

'off'

) plt.plot([1

,35],

[7,7

],'k-'

,linewidth=2)

for i in

range(1

,10):

y = ring[i]*3

+4color =

'red'

if ring[i]

else

'blue'

cir = circle(xy =

(3.5

*i, y)

, radius=

1, alpha=

0.5,facecolor= color)

ax.add_patch(cir)

plt.title(title)

plt.axis([0

,40,0

,10])

plt.pause(

0.5)

defring_updown

(index,action)

:# 如果是第乙個環,那麼可以自由拆卸

global steps

if index ==1:

steps +=

1 ring[index]

= action

visual(steps,index,action)

return

none

# 如果第 n-1 個環不在杆上,需要先裝上

if ring[index-1]

==0:# n-1 not on the ring

ring_updown(index-

1,up)

# n-2 個環需要全部不在杆上,如果有環在杆上,需要先卸下來

for i in

range

(index-2,

0,-1

):if ring[i]==1

:# n-2,n-3,... no the ring

ring_updown(i,down)

steps +=

1 ring[index]

= action

visual(steps,index,action)

return

none

for i in

range(9

,0,-

1): ring_updown(i,down)

上面的**,除去圖示的部分,只有10行有效**。

一共執行了341步驟。

九連環 好玩的九連環

九連環是中國最傑出的益智遊戲。九連環作為我國民間玩具,以金屬絲製成9個圓環,將圓環套裝在橫板或各式框架上,並貫以環柄。遊戲時,按照一定的程式反覆操作,可使9個圓環分別解開,或合而為一。九連環 現已成為一種國際性的益智遊戲,國內外都有學者在研究,拆解九連環的過程中也蘊含著一些數學原理。九連環的迷人之處...

九連環 兒子的玩具 九連環

兒子是7月22號結束了中考,23號參加自主招生考試,24號收到錄取 25號領取通知書,26號正式上課成為一名高中生,結束初中生活還沒來得及歇歇高中就這樣開始了。高中生活非常緊張,早上六點起床趕去學校上自習,晚上十點下課,回到家基本上是十點十五分之間,週日下午放假六小時,晚上接著到校自習,每天的學習時...

九連環 九連環中的數學原理

九連環作為我國民間玩具,以金屬絲製成9個圓環,將圓環套裝在橫板或各式框架上,並貫以環柄。遊戲時,按照一定的程式反覆操作,可使9個圓環分別解開,或合而為一。九連環 現已成為一種國際性的益智遊戲,國內外都有學者在研究,拆解九連環的過程中也蘊含著一些數學原理。2.如圖二所示,如果某乙個環在上面的環杆上,而...