关于约瑟夫有关问题

关于约瑟夫问题
http://baike.baidu.com/view/213217.htm


def jos(n,x):
    li=[1]*n
    k=0
    while li.count(1)>1:
        k= (x+k-1) % (li.count(1))
        li[k]=0
        print li

print jos(10,3)


期望结果
1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 0 1 1 1 1
1 1 0 1 1 0 1 1 0 1
1 0 0 1 1 0 1 1 0 1
1 0 0 1 1 0 0 1 0 1
0 0 0 1 1 0 0 1 0 1
0 0 0 1 1 0 0 0 0 1
0 0 0 1 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0

但是陷入了死循环,请高手指点
有几点要求,列表li的初始化定义不能改,不要再增加循环,可以增加变量


------解决方案--------------------
引用:
        k= (x+k-1) % (li.count(1))


这句有问题,分析一下输出就可看出。
------解决方案--------------------
不求效率的话,用下标编号做个列表,然后实际模拟演算,这样应该很直观吧...
def jos(n, x):
    li = [1] * n
    ids = range(n)
    k = 0
    while len(ids):        
        print li
        k = (x + k -1) % len(ids)
        id = ids.pop(k)
        assert li[id] == 1
        li[id] = 0

jos(10, 3)

------解决方案--------------------
我的环境Python3,简单的写法暂时没想通,有个比较复杂的

def jos(n,x):
all=[1]*n
k=0
while all.count(1)>1:
step = x
while step>0:
k+=1;
k%=n
if all[k]==1:
step -= 1
all[k]=0
print(all)
jos(10,3)
#下面是结果:
#[1, 1, 1, 0, 1, 1, 1, 1, 1, 1]
#[1, 1, 1, 0, 1, 1, 0, 1, 1, 1]
#[1, 1, 1, 0, 1, 1, 0, 1, 1, 0]
#[1, 1, 0, 0, 1, 1, 0, 1, 1, 0]
#[1, 1, 0, 0, 1, 1, 0, 0, 1, 0]
#[1, 0, 0, 0, 1, 1, 0, 0, 1, 0]
#[1, 0, 0, 0, 1, 1, 0, 0, 0, 0]
#[1, 0, 0, 0, 1, 0, 0, 0, 0, 0]
#[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]


楼主你那个里面有考虑到step里面包括为0的值么?
------解决方案--------------------
引用:
引用:

我的环境Python3,简单的写法暂时没想通,有个比较复杂的
Python code

def jos(n,x):
all=[1]*n
k=0
while all.count(1)>1:
step = x
while step>0:
k+=1;
k%=n
if al……

all是个关键字吧,当做变量似乎会带来副作用


多谢指出,all是个built-in function,学习了,谢谢....