我有以下这段代码,试图在其中形成数组“ opt”。在这里,我采用了三个可能的值'pos_set'= [1、2、3],并且可以类似的方式对此进行扩展。但是,我只想为pos_set的任何可能的整数值提供通用代码。
opt = []
if pos_set == 1:
for j in range(1, n):
opt.append([j])
elif pos_set == 2:
for j in range(1, n):
for k in range(j+1, n):
opt.append([j, k])
elif pos_set == 3:
for j in range(1, n):
for k in range(j+1, n):
for l in range(k+1, n):
opt.append([j, k, l])
为了更加清楚起见,我这样做的目的是收集所有的可能性,如果您滚动n边模具,并且只要您滚动更大的值就继续这样做。
例如,如果您滚动序列1-2-6-4,则在这种情况下,较大的数字后面跟随着4。 6,停止滚动。同样,如果您滚动一个序列1-2-6-6,在这种情况下,您会得到一个重复的6,所以您停止了,因为它不大于您之前的滚动。我正在考虑在两个案例中出现较小或相同数字之前的案例,即[1、2、6]。
如果你们能帮助我,我将不胜感激。
答案 0 :(得分:2)
您可以使用以下递归函数:
def f(p, n, i=1):
if p == 0:
return [[]]
return [[j, *l] for j in range(i, n) for l in f(p - 1, n, j + 1)]
这样:
print(f(1, 7))
print(f(2, 7))
print(f(3, 7))
输出:
[[1], [2], [3], [4], [5], [6]]
[[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6], [4, 5], [4, 6], [5, 6]]
[[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [1, 5, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6], [2, 5, 6], [3, 4, 5], [3, 4, 6], [3, 5, 6], [4, 5, 6]]
答案 1 :(得分:1)
不确定您是如何解决问题的,是否只是在考虑构建q pos_set
,还是需要代码方面的帮助以产生满足您目标的实际输出。
这是我编写的代码,它将滚动双面骰子(我只是将其设置为100进行演示),但这将继续滚动另一个骰子并附加其值,直到该数字等于或小于该数值,然后再进行前一骰
除非您也需要此部分,否则我将推迟分解代码。让我知道!
import random
die = list(range(1, 100))
temp = [0, 1, 2]
winners = []
while temp[1] > temp[0]:
temp[0] = random.randint(1, len(die))
temp[1] = random.randint(1, len(die))
temp[0] = temp[2]
if temp[1] > temp[0]:
winners.append(temp[1])
temp[2] = temp[1]
else:
winners.append(temp[1])
break
print(winners)
答案 2 :(得分:1)
对此有一个内置的解决方案itertools.combinations:
In [5]: import itertools
In [6]: list(itertools.combinations(range(1,7), 3))
Out[6]:
[(1, 2, 3),
(1, 2, 4),
(1, 2, 5),
(1, 2, 6),
(1, 3, 4),
(1, 3, 5),
(1, 3, 6),
(1, 4, 5),
(1, 4, 6),
(1, 5, 6),
(2, 3, 4),
(2, 3, 5),
(2, 3, 6),
(2, 4, 5),
(2, 4, 6),
(2, 5, 6),
(3, 4, 5),
(3, 4, 6),
(3, 5, 6),
(4, 5, 6)]