Poniżej jest funkcja iteracyjna do wyświetlenia kolejności elementów:
function Iterate-JosephusFlavius( [ValidateRange(1,1000)] [int]$killEvery = 3, [ValidateRange(1,1000)] [int]$soldiers = 41 ) { [bool[]]$bools = @($false)*$soldiers $indexOfKilledSoldiers=@() $soldiersToKill = $soldiers $rest = 0 $setps=0 while($soldiersToKill -gt 0) { for($i=$rest; $i -lt $bools.Length;$i++) { if($bools[$i] -eq $false) { $setps++ if($setps -eq $killEvery) { $bools[$i] = $true $indexOfKilledSoldiers += $i $soldiersToKill-- $setps=0 } } } $rest = $i -$bools.Length } return $indexOfKilledSoldiers }A tutaj jest funkcja rekurencyjna. Z tą funkcją miałem więcej problemów. Niestety argumenty funkcji są inne dla iteracji jak i dla rekurencji. Jak będę miał chwilkę czasu to poprawię tą różnicę.
function Recursive-JosephusFlavius( [ValidateRange(1,1000)] [int]$killEvery = 3, [int[]]$soldiers, [int[]]$killedSoldiers=@(), [int]$prevRest = 0 ) { if($soldiers.Length -eq 0 ) { return $killedSoldiers } $aliveSoldiers=@() if($soldiers.Length - $killEvery -lt 0) { $soldierToKill = (($killEvery + $prevRest) -1) % $soldiers.Length for($i=0; $i -lt $soldiers.Length; $i++) { if($soldierToKill -eq $i) { $killedSoldiers += $soldiers[$i] }else { $aliveSoldiers += $soldiers[$i] } } } else { for($i=0; $i -lt $soldiers.Length; $i++) { if(($i+1) % $killEvery -ne 0) { $aliveSoldiers += $soldiers[($i-$prevRest)] }else { $killedSoldiers += $soldiers[($i-$prevRest)] } } $soldierToKill = $soldiers.Length % $killEvery } return Recursive-JosephusFlavius -soldiers $aliveSoldiers -killEvery $killEvery -killedSoldiers $killedSoldiers -prevRest $soldierToKill }
Wywołanie tych funkcji oraz sprawdzenie działania wygląda następująco:
$soldiers = 0..40 #41 soldiers $killEvery = 3 $res1= Recursive-JosephusFlavius -soldiers $soldiers -killEvery $killEvery $res2 = Iterate-JosephusFlavius -soldiers ($soldiers.Length) -killEvery $killEvery for($i=0; $i -lt [math]::Max($res1.Length,$res2.Length); $i++) { if($res1[$i] -ne $res2[$i]) { throw "not the same" } else { Write-Host $res1[$i] } }
Brak komentarzy:
Prześlij komentarz