特定のコイン値のセットを持つ通貨でコインを使用して特定の金額を表すすべての可能な方法を返す次のコードを作成しました。
IEnumerable<IEnumerable<int>> getCoins(int price)
{
int[] coinValues = new int[] { 1, 2, 5, 10, 20, 50, 100, 200 }; // Coin values
if (coinValues.Contains(price)) yield return new int[] { price }; // If the price can be represented be a single coin
// For every coin that is smaller than the price, take it away, call the function recursively and concatenate it later
foreach (int coin in coinValues.Where(x => x < price))
foreach (IEnumerable<int> match in getCoins(price - coin))
yield return match.Concat(new int[] { coin });
}
これは問題なく動作しますが、たとえばとを 2 つの異なる表現としてprice = 3
扱います。この問題は、見つかったすべての値を List に保存し、生成されたときに重複を削除することで解決できますが、その方法では、コードのジェネレーターの性質が犠牲になります。を使用してジェネレーターでありながら、重複を含まないようにコードを変更できますか?{1c, 2c}
{2c, 1c}
yield return