Symulację graficzną algorytmu można zobaczyć na tej stronie.
Dla uproszczenia numeracja miejsc jest od 0. Poniżej jest rozwiązanie iteracyjne:
function Solve-JosephusProblem { param( [ValidateRange(1,1000)] [int]$killEvery = 3, [ValidateRange(1,1000)] [int]$soldiers = 40 ) $i=1 $rest=0 while($i -le $soldiers) { $rest = ($rest + $killEvery ) % $i $i++ } return $rest }Sprawdzenie miejsca dla 10 żołnierzy:
Solve-JosephusProblem -soldiers 10 -killEvery 3 #3
Gdyby samobójca był wybierany co 1 osobę to ostatnia osoba dokona samobójstwa.
Solve-JosephusProblem -soldiers 41 -killEvery 1
Poniżej jest rozwiązanie rekurencyjne:
function Solve-JosephusProblemRec { param( [ValidateRange(1,1000)] [int]$killEvery = 3, [ValidateRange(1,1000)] [int]$soldiers = 40 ) if($soldiers -eq 1) { return 0 } else { [int]$recSolve = Solve-JosephusProblemRec -killEvery $killEvery -soldiers ($soldiers-1) return (($recSolve +$killEvery ) % $soldiers ) } }
Nie ukrywam, że dużo pomogła mi strona na wiki opisująca ogólny problem.
Sprawdzamy na którym miejscu powinien Józef Flawiusz się ustawić:
$soldiers =41 $killEvery =3 Solve-JosephusProblem -soldiers $soldiers -killEvery $killEvery #30 Solve-JosephusProblemRec -soldiers $soldiers -killEvery $killEvery #30
Brak komentarzy:
Prześlij komentarz