Pythonでデカルト積を実装するいくつかの方法

はじめに:インタビュー中にインタビュアーが尋ねたこの質問は、当時はあまり良くありませんでした。インタビュー後、それを確認したところ、ほとんどのブログはツールキットを使用して実装されており、ほとんどのブログコンテンツはまだ完成しています。同様に、数も変わっておらず、長い間検索してみたところ、役に立つブログはいくつか見つかりませんでした。実際、これはほとんどのブログの現在の傾向でもあり、お互いを盗用しています。私自身の考えの内容が少しなければ、そのようなブログを書くことの意味がわかりません。そこで、ツールキットを使用しないソリューションを実装する予定なので、他の誰かのブログの助けを借りて、デカルト積を解決するためにバックトラックを使用することに気付きました。この問題を解決するいくつかの方法を次に示します。ソリューションの概要:????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????

1.ツールキット

from itertools import product
res = list(product(['a','b],['c'],['d','e','g']))
print(res)

2.再帰ジェネレーター。このメソッドは ブログhttps://www.lfhacks.com/tech/python-recursive-generatorのコンテンツを参照し 、コードは直接コピーされます。

def combi(seq):
    if not seq:
        yield []
    else:
        for element in seq[0]:
            for rest in combi(seq[1:]):
                yield [element] + rest

次のコードでテストします

n=[[1,2,3],[4],[5,6,7]]
print list(combi(n))

動作モードは次のとおりです。

拆出第一个序列,得到1,2,3
对于1                      (暂存结果[1])
拆出第2个序列,得到4
    对于4                      (暂存结果[1, 4])
    拆出第3个序列,得到5,6,7
        对于5                       (暂存结果[1, 4, 5])
        拆出第4个序列(空),得到(空)       
        把5加到(空)前面,返回结果    (返回暂存结果[1, 4, 5])
        对于6                       (暂存结果[1, 4, 6])
        拆出第4个序列(空),得到(空)        
        把6加到(空)前面,返回结果    (返回暂存结果[1, 4, 6])
        对于7                       (暂存结果[1, 4, 7])
        拆出第4个序列(空),得到(空)       
        把7加到(空)前面,返回结果    (返回暂存结果[1, 4, 7])

3.遡及的手法の実施

arr = [['a','b],['c'],['d','e','g']]
res = []
layer = len(arr)
def func(arr,index,temp,layer):
    if len(temp)==layer:
        res.append(temp[:])
    else:
        if not arr[index]:
            layer -= 1
            func(arr, index + 1, temp,layer)
        else:
            for i in range(len(arr[index])):
                temp.append(arr[index][i])
                func(arr,index+1,temp,layer)
                temp.pop()

func(arr,0,[],layer)
print(res)

ここでレイヤーを使用する理由は、サブリストが空のリストとして表示されないようにするためです。サブリストが空のリストでない場合、tempの長さがの長さと等しいときに結果セットにtempを追加できます。 arr。

参照:https//blog.csdn.net/ylyg050518/article/details/78787432

おすすめ

転載: blog.csdn.net/Matrix_cc/article/details/109744803