我编写了以下代码,该代码返回所有可能的方式来表示使用具有特定硬币值的货币中的硬币来表示一定数量的金钱:
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 });
}
这很好用,但例如price = 3
它将{1c, 2c}
和{2c, 1c}
视为两种不同的表示。该问题可以通过将所有找到的值存储在 List 中来解决,然后在生成重复项时删除它们,但这样会牺牲代码的生成器性质。可以修改代码以不包含重复项,同时仍然是使用的生成器yield return
吗?