這裏,我們去:
static void Main(string[] args)
{
foreach (var li in BreakMeDown(7))
Console.WriteLine(string.Join(", ", li));
}
public static IEnumerable<IReadOnlyCollection<int>> BreakMeDown(int n)
{
for (int i = 1, j = n - 1; i <= j; i++, j--)
{
foreach (var li in BreakMeDown(j).Select(bd => bd.Concat(new[] {i}).ToList()))
yield return li;
foreach (var li in BreakMeDown(i).Select(bd => bd.Concat(new[] {j}).ToList()))
yield return li;
yield return new[] {i, j};
}
}
編輯:
好了,根據你想刪除重複產生的序列的註釋。在這種情況下,要使用的正確數據結構是一個字典映射整數與出現次數。例如。 { 1: 5 }
表示5的可能分解,其中數字1重複5次。
下面是代碼(我承擔了MoreLinq和Json.NET的依賴,因爲我不想要實現DistinctBy和對的IEqualityComparer詞典,但如果你願意,你可以做這些你自己):
static void Main(string[] args)
{
foreach (var li in BreakMeDown(5).DistinctBy(JsonConvert.SerializeObject))
Console.WriteLine(string.Join(", ", li));
}
static IImmutableDictionary<int, int> Increment(this IImmutableDictionary<int, int> dict, int i)
{
return dict.SetItem(i, dict.TryGetValue(i, out int iCount) ? iCount + 1 : 1);
}
public static IEnumerable<IImmutableDictionary<int, int>> BreakMeDown(int n)
{
for (int i = 1, j = n - 1; i <= j; i++, j--)
{
var iAndJ = ImmutableSortedDictionary.Create<int, int>().Increment(i).Increment(j);
var bdJ = BreakMeDown(j).Select(bd => bd.Increment(i));
var bdI = BreakMeDown(i).Select(bd => bd.Increment(j));
var list = bdI.Concat(bdJ).Concat(new[] { iAndJ });
foreach (var li in list)
{
yield return li;
}
}
}
其實是問題,「找到所有n對和n的正整數對**」?據我所知,你的算法總是產生長度爲2的列表,但許多數字可以表示爲3,4等加數的總和。 –
@AsadSaeeduddin它一次評估一對,但遞歸它一直打破它,以產生所有。它只是不知道如何打包/分組。它只查看輸出的總和爲7,但總和爲7。如果你註釋掉遞歸,你可以得到這些對。 – Paparazzi
我想也許我把j,j的每個故障與i的每個故障以及i和j的故障組的笛卡爾積連接起來。這應該涵蓋所有情況 –