读书人

关于约瑟夫有关问题

发布时间: 2013-01-04 10:04:16 作者: rapoo

关于约瑟夫问题
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)


期望结果
1111111111
1101111111
1101101111
1101101101
1001101101
1001100101
0001100101
0001100001
0001000001
0001000000

但是陷入了死循环,请高手指点
有几点要求,列表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,学习了,谢谢....

读书人网 >perl python

热点推荐