我需要协助重复组合。已经在网上搜索过,虽然我发现了一些例子但我完全无法理解它们。我的目标是简单的函数(CombinationsWithRepetiion)接收包含项目的列表(在本例中为整数值)和length(表示每个组合可以有多长)并返回包含结果的列表。
List<int> input = new List<int>() {1, 2, 3}
CombinationsWithRepetition(input, length);
结果:
长度= 1:1,2,3
长度= 2:11,12,13,21,22,23,31,32,33
长度= 3:111,112 ......
我希望有人帮助我,并提前感谢你!
答案 0 :(得分:11)
确定,
这是C#版本 - 我引导你完成它
static IEnumerable<String> CombinationsWithRepition(IEnumerable<int> input, int length)
{
if (length <= 0)
yield return "";
else
{
foreach(var i in input)
foreach(var c in CombinationsWithRepition(input, length-1))
yield return i.ToString() + c;
}
}
首先检查递归的边界情况(在这种情况下,如果是length <= 0
) - 在这种情况下答案是空字符串(顺便说一句:我选择返回字符串,因为你没有说出你真正的需要 - 应该很容易改变。)
在任何其他情况下,你看一下每个输入i
和recursivley采用下一个较小的组合,然后将它们一起插入(使用String-concatination,因为我想要字符串)。
我希望您了解IEnumerable
/ yield
的内容 - 如果不在评论中这样说的话。
以下是示例输出:
foreach (var c in CombinationsWithRepition(new int[]{1,2,3}, 3))
Console.WriteLine (c);
111
112
113
...
332
333
以下使用我在下面的注释中概述的想法,并且没有堆栈溢出异常的问题(递归可能适用于大长度) - 这也假设字符串,因为它们更容易使用(我可以做一个简单的{ {1}}简化事情)
PadLeft