设置一个条件>;相等<;VB.Net解决方案中的值

设置一个条件>;相等<;VB.Net解决方案中的值,vb.net,Vb.net,如何设置条件,仅显示1、2、3、4或5个数字的变体 Function SumUpRecursive(numbers As List(Of Integer), target As Integer, part As List(Of Integer), solutions As List(Of List(Of Integer))) As List(Of List(Of Integer)) Dim s = part.Sum() If s = target Then ' M

如何设置条件,仅显示1、2、3、4或5个数字的变体

Function SumUpRecursive(numbers As List(Of Integer), target As Integer, part As List(Of Integer), solutions As List(Of List(Of Integer))) As List(Of List(Of Integer))
    Dim s = part.Sum()
    If s = target Then
        ' MsgBox("sum(" & String.Join(",", part.[Select](Function(n) n.ToString()).ToArray()) & ")=" & target)
        solutions.Add(part)
    End If
    If s >= target Then
        Return Nothing
    End If
    For i As Integer = 0 To numbers.Count - 1
        Dim remaining = New List(Of Integer)()
        Dim n As Integer = numbers(i)
        For j As Integer = i + 1 To numbers.Count - 1
            remaining.Add(numbers(j))
        Next
        Dim part_rec = New List(Of Integer)(part)
        part_rec.Add(n)
        SumUpRecursive(remaining, target, part_rec, solutions)
    Next
    Return solutions
End Function
按钮:

 Dim numbers As Integer() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
        16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
        35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
        54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
        73, 74, 75, 76, 77, 78, 79, 80}
    Dim target As Integer = 15
    Dim nums = SumUpRecursive((numbers.ToList()), target, New List(Of Integer), New List(Of List(Of Integer)))
    If nums Is Nothing Then
        MsgBox("Failure :(")
    Else
        TxtListScanTxt.Lines = nums.Select(Function(b) String.Join(", ", b)).ToArray()
    End If
输出:

1, 2, 3, 4, 5
1, 2, 3, 9
1, 2, 4, 8
1, 2, 5, 7
1, 2, 12
1, 3, 4, 7
1, 3, 5, 6
1, 3, 11
1, 4, 10
1, 5, 9
1, 6, 8
1, 14
2, 3, 4, 6
2, 3, 10
2, 4, 9
2, 5, 8
2, 6, 7
2, 13
3, 4, 8
3, 5, 7
3, 12
4, 5, 6
4, 11
5, 10
6, 9
7, 8
15
假设我只想显示3个组合(仅3位组合)

等等


如何改进代码以实现这一点?仅计算3、4或5的组合,而不是全部。因为否则程序会崩溃,所以组合太多。对于大量。请添加一些重载以帮助解决此问题

模块中的代码:

公共函数SumUpRecursive(数字为IEnumerable(属于整数)、目标为Integer、solutionLength为Integer)为IEnumerable(属于IEnumerable(属于整数))
返回SumUpRecursive(数字,目标)。其中(函数(项目)项。计数()=target然后
一无所获
如果结束
对于i,整数=0到数字。计数-1
剩余尺寸=新列表(整数)()
尺寸n为整数=数字(i)
对于j,整数=i+1到数字。计数-1
剩余。添加(数字(j))
下一个
Dim part_rec=来自{n}的(整数的)新列表(部分)
SumUpRecursive(剩余、目标、部分建议、解决方案)
下一个
返回解决方案
端函数
格式代码:

Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
尺寸低=1,高=80
尺寸编号=可枚举范围(低、高-低+1)
暗目标=15
Dim nums=SumUpRecursive(数字、目标)
如果nums什么都不是,那么
MsgBox(“失败:(”)
其他的
TxtListScanTxt.Lines=nums.Select(函数(b)String.Join(“,”,b)).ToArray()
如果结束
端接头
还请注意,一些代码被简化,例如您的整数列表被自动化

Dim low=1,high=80
尺寸编号=可枚举范围(低、高-低+1)
(如果你想排除一些数字,你可以这样做(很抱歉,我没有费心去看你从1到80的所有数字是否都存在)):

Enumerable.Range(低,高-低+1)。除了({1,2,3,5,8,13,21,34,55})
因此,一旦你有了重载,就没有理由调用大型递归函数,传递新的列表,这对于其他使用你的代码的人(你的教授?)来说真的很混乱。你可以用访问修饰符隐藏这个函数,只需调用一个更简单的重载

类型已尽可能更改为
IEnumerable
,而不是
List

但将解决方案限制在最大数量的关键在于第一个过载


SumUpRecursive(number,target)。Where(Function(item)item.Count()是的,很酷。感谢每一位用一段代码为开发做出贡献的人。教大家并开发新项目。
3, 4, 8
3, 5, 7
4, 5, 6