0

再帰を使用してリストを生成するコードを作成する必要がありますが、リストの最後の項目は空である必要があります。これは私のコードであり、実際に生成しているものと生成するために必要なものです。

def coin_change(avail_change, total_cents):
    if avail_change == []:
        return []
    if total_cents // avail_change[0] >= 1:
        first = total_cents // avail_change[0]
        first_list = [avail_change[0], first]
        return [first_list, coin_change(avail_change[1:], (total_cents - (avail_change[0] * first)))]
    else:
        return coin_change(avail_change[1:], total_cents)

結果:

coin_change([50,5,1],108) => [[50,2],[5,1],[1,3]]
expected [[50, 2], [5, 1], [1, 3]], saw [[50, 2], [[5, 1], [[1, 3], []]]]

後でリストを終了する必要がありますが、[1,3]どうしたらよいかわかりません。

4

4 に答える 4

1

再帰を使用するときは、基本ケースが何であるか、それが以前の呼び出しとどのように組み合わされるかを最初に考えてください。この問題では、return [first_list, ...そうすると、結果がネストされます。これの代わりに、新しい結果を同じリストに挿入する必要があります。

def coin_change(avail_change, total_cents):
    if not avail_change:
        return []
    else:
        first = total_cents // avail_change[0]
        result = coin_change(avail_change[1:], (total_cents % avail_change[0]))
        if first > 0:
            result.insert(0, [avail_change[0], first])
        return result

print coin_change([50,5,1],108) # [[50, 2], [5, 1], [1, 3]]
于 2013-03-17T20:52:53.450 に答える
0

これは役立つかもしれません:

coins = []
def coin_change(avail_change, total_cents):
    if avail_change == []:
        raise Exception()
    if total_cents // avail_change[0] >= 1:
        first = total_cents // avail_change[0]
        first_list = [avail_change[0], first]
        coins.append(first_list)
        try:
            return coin_change(avail_change[1:], (total_cents - (avail_change[0] * first)))
        except:
            return coins
    else:
        try:
            return coin_change(avail_change[1:], total_cents)
        except:
            return coins

結果:

>>> coin_change ([50,5,1], 108)
[[50, 2], [5, 1], [1, 3]]
于 2013-03-17T22:17:41.157 に答える
0
first_list = []


def coin_change(avail_change, total_cents):
    if not avail_change:
        return []

    if total_cents // avail_change[0] >= 1:
        first = total_cents // avail_change[0]
        first_list.append([avail_change[0], first])
        coin_change(avail_change[1:], (total_cents - (avail_change[0] * first)))

    else:
        coin_change(avail_change[1:], total_cents)

    return first_list

x = coin_change([50, 5, 1], 108)
print x

結果:
[[50, 2], [5, 1], [1, 3]] 思い通り

x = coin_change([ ], 108) print x

出力 [ ]

于 2013-03-17T21:08:55.977 に答える
0

再帰呼び出しごとにリストを返すため、結果はますますネストされたリストの 1 つになります。

また、リストではなく 2 タプルを返す必要があります。リストは変更可能で固定長ではないことを意図していますが、(denomination, count) のペアはどちらでもありません。

また、お楽しみとして、 の出力はcoin_change([3,2],16)どうなるでしょうか。

于 2013-03-17T20:48:01.247 に答える