我有以下用python 2.7编写的代码来查找n时间的笛卡尔积(AxAxA ... xA) -
undefined method 'for' for #<Devise::ParameterSanitizer
当n = 1时,这适用。但是将参数值从 cartesian_product(事件,事件,1) 更改为 cartesian_product(事件,事件,2) 不起作用。似乎有一个无限循环正在运行。我无法确定我在哪里犯了错误。
答案 0 :(得分:3)
当您将对全局变量prod
的引用传递给递归调用时,您正在修改set2
也引用的列表。这意味着set2
在迭代时会增长,这意味着迭代器永远不会到达终点。
这里不需要全局变量。 返回计算产品。
def cartesian_product(set1, n):
# Return a set of n-tuples
rv = set()
if n == 0:
# Degenerate case: A^0 == the set containing the empty tuple
rv.add(())
else:
rv = set()
for x in set1:
for y in cartesian_product(set1, n-1):
rv.add((x,) + y)
return rv
如果您想坚持原始参数的顺序,请改用rv = []
和rv.append
。
答案 1 :(得分:2)
def cartesian_product(*X):
if len(X) == 1: #special case, only X1
return [ (x0, ) for x0 in X[0] ]
else:
return [ (x0,)+t1 for x0 in X[0] for t1 in cartesian_product(*X[1:]) ]
n=int(raw_input("Number of times to roll: "))
events=[1,2,3,4,5,6]
prod=[]
for arg in range(n+1):
prod.append(events)
print cartesian_product(*prod)
输出:
Number of times to roll: 1
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]
您也可以在事件列表中传递字符串,但它也会在元组中打印字符串。
答案 2 :(得分:1)
在递归调用cartesian_product(set1,prod,n-1)
内传递列表prod,然后再次向其附加值,因此它会随着时间的推移而增长,内部循环永远不会终止。也许你可能需要改变你的实现。