0

[1,2,3,4] などの一連の数値を入力として取り、合計が奇数のサブセットのみを指定します。たとえば、[1]、[1,2]、[2,3] などです。

あまり試したことがないので、どこから始めればよいかわかりません。申し訳ありませんが、私はプログラミングに非常に慣れていませんが、これまでのところ私が持っているものは次のとおりです。すべての可能なサブセットを生成します。

    def rsubsets(s):
        if len(s) == 0:
           return [[]]
        temp = rsubsets(s[1:])
        new = []
        for itm in temp:
           new.append(itm)
        n = len(new)
        for j in range(n):
           new[j] = new[j] + [s[0]]
        return temp + new

ありがとう。

4

2 に答える 2

3

既存の機能に基づいて構築します。

def odd_subsets(s):
    return [x for x in rsubsets(s) if sum(s) % 2 == 1]

または理解なし:

def odd_subsets(s):
    odd = []
    for subset in rsubsets(s):
        if sum(s) % 2 == 1:
            odd.append(subset)
    return odd
于 2012-12-02T22:11:51.417 に答える
1
def odd_subsets(s):
    lRet = []
    for i in range(len(s)):
        lRet.extend([c for c in itertools.combinations(s,i+1) if sum(c)%2==1])
    return lRet

あなたが最初の関数を使うことに完全に固執しているなら、これはそれをやってのける最も簡単な方法です

def rsubsets(s):
    def all_subsets(s):
        if len(s) == 0:
           return [[]]
        temp = all_subsets(s[1:])
        new = []
        for itm in temp:
           new.append(itm)
        n = len(new)
        for j in range(n):
           new[j] = new[j] + [s[0]]
        return temp + new
    return [i for i in all_subsets(s) if sum(i)%2==1]

これが行うことのほとんどは、最初の再帰関数を呼び出して結果をフィルター処理することです。

別の方法は、フラグを使用することです...

def rsubsets(s,bFilter=True):
    if len(s) == 0:
        return [[]]
    temp = rsubsets(s[1:],False)
    new = []
    for itm in temp:
       new.append(itm)
    n = len(new)
    for j in range(n):
       new[j] = new[j] + [s[0]]
    if bFilter:
        return [i for i in temp+new if sum(i)%2 ==1]
    return temp + new
于 2012-12-02T22:10:47.080 に答える