python递归问题

时间:2017-05-26 18:06:13

标签: python recursion

我有以下用python 2.7编写的代码来查找n时间的笛卡尔积(AxAxA ... xA) -

undefined method 'for' for #<Devise::ParameterSanitizer

当n = 1时,这适用。但是将参数值从 cartesian_product(事件,事件,1) 更改为 cartesian_product(事件,事件,2) 不起作用。似乎有一个无限循环正在运行。我无法确定我在哪里犯了错误。

3 个答案:

答案 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,然后再次向其附加值,因此它会随着时间的推移而增长,内部循环永远不会终止。也许你可能需要改变你的实现。