約瑟夫斯問題
我上週的文章是關於解決kotlin的約瑟夫斯問題的。 為了便於比較,這是我最初編寫的版本:
class
soldier
(val
position
:int
)fun
isdead()=
state
==state
.dead
}enum
class
state
class
circle
(private
valsize
:int
,private
valstep
:int
)val
last
=person
last
.next
=first
}private
funcreatenext
(soldier
:soldier
):soldier
funfindsurvivor
():soldier
soldier
.suicide
()numberofdead++}
return
nextlivingsoldier
(soldier)}
private
funnextlivingsoldier
(soldier
:soldier
):soldier
return
currentsoldier
}}
帖子以乙個開放的問題結尾:**是正確的方法嗎? 特別是:
我收到了來自社群的許多不同反饋,包括jetbrains的ilya ryzhenkov,cédricbeust,peter somerhoff和gaëtanzoritchak。 多謝你們!
我認為最有趣的是與gaëtan最初的gist略有修改的版本:
class
soldier
(val
position
:int
,var
state
:state
=state
.living
)fun
isalive()=
state
==state
.living
}enum
class
state
class
circle
(val
size
:int
,val
step
:int)).
tolist
()fun
findsurvivor
():soldier
soldier
.suicide()}
return
soldier
.nextlivingsoldier()}
tailrec
private
funsoldier
.nextlivingsoldier
():soldier=if
(next
().isalive
())next
()else
next
().nextlivingsoldier
()private
funsoldier
.next()=
soldiers
.get(if
(position
==size-1
)0else
position+1
)}
我非常喜歡此**,因為它感覺更像kotlin。 改進很多。
遞迴的nextlivingsoldier()
函式已使用tailrec
進行「注釋」,以便編譯器執行其優化魔術。
該soldier
類不知道它的容器circle
size
,因此使用它的功能已經在內部移動circle
類為擴充套件函式的soldier
類。
這是kotlin擴充套件功能的絕佳用法。
顯然,學習該語言的語法-及其api,
用這種語言編寫解決方案或應用的**,
要求反饋,
閱讀,分析和理解反饋,
沖洗並重複。
翻譯自:約瑟夫斯問題
約瑟夫斯問題
有n個人圍成一圈,報數從1到m依次迴圈報數,報到m的就退出 死 現在我們來看遞推,由於為了方便表示 s m i 0的情況,我們讓第一人的編號為0,從一開始也可以 既然你問遞推,那步驟就不說了,只說這個公式吧 讓獲勝者的編號為0 最後乙個人只有他了當然是0 f i 表示獲勝者在剩下i個人時的那一局的編...
約瑟夫斯問題及其程式設計
然後問題是,給定了n和k,一開始要站在什麼地方才能避免被處決?在約瑟夫斯問題裡詳細介紹了其中k 2時此問題的數學方式的解法,並得到了乙個可以通過數學歸納法證明的定理 如果比較令人眼前一亮的是這個結論的表現形式竟與整數n的二進位制表示有關 即把n 的第一位移動到最後,便得到 的二進位制表示為 接著使用...
演算法系列 約瑟夫斯問題
約瑟夫斯問題 有時也稱為約瑟夫斯置換 是乙個出現在電腦科學 和數學中的問題。在計算機程式設計 的演算法中,類似問題又稱為約瑟夫環。有個囚犯站成乙個圓圈 準備處決。首先從乙個人開始,越過 個人 因為第乙個人已經被越過 並殺掉第k個人。接著,再越過 個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最...