約瑟夫斯問題 關於約瑟夫斯問題的反饋

2021-10-06 23:30:26 字數 2341 閱讀 2193

約瑟夫斯問題

我上週的文章是關於解決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類不知道它的容器circlesize,因此使用它的功能已經在內部移動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個人。這個過程沿著圓圈一直進行,直到最...