2

可変数の引数(各引数は反復可能なリストまたはセット)を取り、各引数の連結されたすべての組み合わせのセットを返す再帰関数を作成したいと考えていました。可変数の引数を持つ関数の書き方を学び、再帰関数の書き方も知っていますが、これら 2 つを Python で組み合わせる方法がわかりません (またはそれが可能かどうかもわかりません)。

これが私のコードです:

def generate_combinations( *args ):
    # returns all combinations of each of the arguments
    if len( args ) == 1:
        return set( args[0] )

    result = set()
    lastdigits = generate_combinations( args[1:] )
    for d in args[0]:
         result.add( d + lastdigits )      

if __name__ == '__main__':
    lastDigit = [ '1', '2', '3' ]
    allDigits = [ '4', '5' ]
    print("{}".format( generate_combinations( allDigits, lastDigit )))

期待される出力:

14
15
24
25
34
35

私のコードの「問題」lastdigits = generate_combinations( args[1:] )は 7 行目にあります。ここでやりたかったのは、最初の引数を除くすべての元の引数を関数に渡すことです (したがって、再帰を作成します)。そして、これは明らかにそれを行う方法ではありません。私の質問: これを行うことができますか?

Ps: 1 つの引数を持つリストのリストを使用して同じことを達成できることはわかっていますが、これがまったく可能であることに興味があります。

4

1 に答える 1

4

要求されたジョブは、次の行によって実行されます。

args = list(args)
args.pop(0)
recursiveCall( *tuple(args) )

ここで、関数の実装に少しバグがありました (または、set の使用を誤解している可能性があります)。

def generate_combinations( *args, **kwargs ):
    print("called with", args)
    #terminate recursion
    if len(args) == 1:
        return list(set(args[0]))

    #recursion
    else:
        result = []
        args = list(args)
        heads = args.pop(0)
        tails = generate_combinations( *args, **kwargs )
        for head in heads:
            for tail in tails:
                result.append(head + tail)
        return result

if __name__ == '__main__':
    allDigits = [ '1', '2', '3' ]
    lastDigit = [ '4', '5' ]
    letters   = [ 'a', 'b' ]
    print("{}".format( generate_combinations( allDigits, lastDigit, letters , Useless='parameter')))

実行を与える:

['14a', '14b', '15a', '15b', '24a', '24b', '25a', '25b', '34a', '34b', '35a', '35b']

これをお楽しみください ;)

アーサー。

于 2014-10-31T09:33:24.510 に答える