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