我想為一般約瑟夫斯問題找到最簡單的演算法,即在任何方向上計數。
以組合的“遞回串列”演算法為基礎(Python)。
它適用于積極的轉變,并以消極的方式開始,但后來出了點問題。
def add(x):
if x >= 0:
return 1
return -1
def josephus(arr, start, shift):
if len(arr) == 1:
return arr
else:
start = (start shift - add(shift)) % len(arr)
arr.pop(start)
print(arr)
return josephus(arr, start, shift)
size = int(input())
people = list(range(1, size 1))
start = int(input()) - 1
shift = int(input())
print(people)
josephus(people, start, shift)
添加幾個“if”陳述句可能會有所幫助,但我不想這樣做。
uj5u.com熱心網友回復:
負值行為不同的原因是,在執行之后arr.pop(start),start索引處的值(以新大小為模)將始終是“順時針”(右)方向的下一個元素。
當偏移為負時,應該反映這種效果。
所以當shift是負數時,start在執行后減去一個pop:
arr.pop(start)
if shift < 0:
start -= 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325472.html
上一篇:從塊引數動態創建方法
