0

私は道に迷っていると思うので、助けが必要です。以前にこのサイトで検索したことはありますし、もちろん Google も検索しましたが、私にとって単純なことであるとすれば、まったく質問していないことを信じてください。私はPythonが初めてで、コーディングはそれほど簡単ではありません。

とにかく、私のコードを見てください:

def coin_problem(price, cash_coins):
    if (price < 0):
        return []
    if (price == 0):
        return [[]]

    options = []

    for a_coin in cash_coins:
        coins_minus_coin = cash_coins[:]
        coins_minus_coin.remove(a_coin)
        sub_coin_problem = coin_problem (price - a_coin, cash_coins)
        for coin in sub_coin_problem:
            coin.append(a_coin)
        options.extend(sub_coin_problem)

    return options

print coin_problem(4, [1, 2])

ご覧のとおり、私は有名なコインの問題を再帰によって処理しようとしました (以前に書いたように、多くの人がすでにこれについて質問していることを知っています。彼らの質問と回答を読みましたが、まだ完全には理解できませんでした。ソリューション)。

このコードはすべて私が作成したものです。そして今、私は立ち往生して混乱しています。"price" の値が 4 で "cash_coins" の値が [1,2] の場合、次のような値を返す代わりに:

[1,1,1,1]
[2,2]
[2,1,1]

私はもっ​​と似たものを手に入れます:

[[1, 1, 1, 1], [2, 1, 1], [1, 2, 1], [1, 1, 2], [2, 2]]

「2」とダブル「1」の組み合わせは、「1」ではなく 3 回繰り返されます。問題を修正したり、コードを改善したりして、より適切に機能するようにするにはどうすればよいかわかりません。

4

2 に答える 2

2

リストに 1 つの項目を追加する場合は、 を使用しますappend。2 つのリストを結合する場合は、 を使用しますextend

于 2013-11-08T16:53:42.637 に答える
0

チップ:

    coins_minus_coin = cash_coins[:]
    coins_minus_coin.remove(coin)

この変数を使用することはありません。

    for i in sub_coins:
        i.append(coin)
    cash_coins_options.append(sub_coins)

どちらも決して使用しませんi。私はあなたが意味したと思います:

    for i in sub_coins:
        i.append(coin)
        cash_coins_options.append(i)

これにより、奇妙な結果の問題は解決されますが、ソリューションは依然として[]. なんで?再帰はreturn [];でのみ停止できます。単一のコインを使用して価格を伝えることができる場合、別の基本的なケースを処理できません。この単純な条件を一番上に追加してみてください。

# actually I changed my mind-
# I assume you're learning so try this one yourself :-)

これにより、関数の動作が大幅に改善されます。

>>> print coin_problem(4, [1,2])
[[2, 1, 1], [1, 2, 1], [2, 2]]

これにより、正しい答えが得られます(一部は重複していますが)。

于 2013-11-08T17:06:25.303 に答える