62,046
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var arr = new int[] { 1, 2, 4, 7, 9 };
var cnt = 0;
foreach (var result in 组合(arr, 5, 10))
{
Console.Write($"第{++cnt}个答案:");
foreach (var x in result)
Console.Write($"{x} ");
Console.WriteLine();
}
Console.WriteLine("................按任意键结束");
Console.ReadKey();
}
static IEnumerable<int[]> 组合(int[] arr, int count, int sum)
{
if (count > 0)
{
var a = arr.Take(count).ToArray();
var s = a.Sum();
if (s < sum)
yield break;
if (s == sum)
yield return a;
else
{
foreach (var r in 组合(arr, count - 1, sum))
yield return r;
foreach (var r in 组合(arr, count - 1, sum - arr[count - 1]))
yield return r.Concat(new int[] { arr[count - 1] }).ToArray();
}
}
}
}
}
抛开程序代码本身的那点编程语句,看看函数(符号运算)递归规则。如果不理解,那说明你没有学过符号函数知识。这需要在高中没打下逻辑符号解题基础、后来需要学过一点一阶子句逻辑相关的符号化描述方法即可。