0

我想为一般约瑟夫斯问题找到最简单的算法,即任何方向的计数
以组合的“递归列表”算法为基础(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”语句可能会有所帮助,但我不想这样做。

4

1 回答 1

2

负值行为不同的原因是执行arr.pop(start),索引处的start值(以新大小为模)将始终是“顺时针”(右)方向的下一个元素。

当偏移为负时,应该反映这种效果。

所以当是负数时,在执行后shift减去一个:startpop

    arr.pop(start)
    if shift < 0: 
        start -= 1
于 2021-10-18T13:28:16.753 回答