我将为初学者更好地解释标题。我的问题与常见问题非常相似:查找整数数组问题的所有排列。
我试图在给定整数列表和目标数字的情况下查找是否可以从列表中选择数字的任何组合,以便它们的总和与目标匹配。它必须使用函数式编程实践来完成,这意味着所有循环和突变都已经结束,只有巧妙的递归。完全公开:这是一个家庭作业,方法头由教授设置。这就是我所拥有的:
public static Integer sum(final List<Integer> values) {
if(values.isEmpty() || values == null) {
return 0;
}
else {
return values.get(0) + sum(values.subList(1, values.size()));
}
}
public static boolean groupExists(final List<Integer> numbers, final int target) {
if(numbers == null || numbers.isEmpty()) {
return false;
}
if(numbers.contains(target)) {
return true;
}
if(sum(numbers) == target) {
return true;
}
else {
groupExists(numbers.subList(1, numbers.size()), target);
return false;
}
}
sum 方法已经过测试和工作,groupExists 方法是我正在研究的方法。我认为它非常接近,如果给定一个列表 [1,2,3,4],它将对 3 和 10 等目标返回 true,但对 6 则返回 false,这让我感到困惑,因为 1,2,3 是正确的并添加到 6。显然缺少一些东西。此外,我正在查看的主要问题是它没有测试所有可能的组合,例如,第一个和最后一个数字没有被加在一起作为一种可能性。
更新:根据西蒙的回答工作了一段时间后,这就是我所看到的:
public static boolean groupExists(final List<Integer> numbers, final int target) {
if(numbers == null || numbers.isEmpty()) {
return false;
}
if(numbers.isEmpty()) {
return false;
}
if(numbers.contains(target)) {
return true;
}
if(sum(numbers.subList(1, numbers.size())) == (target - numbers.get(0))) {
return true; }
else {
return groupExists(numbers.subList(1, numbers.size()), target);
}
}