有人可以帮我看看下面的递归代码吗?
给定一个输入数组和一个目标,我想为任何与目标值相加的非空子集返回一个布尔值 true。我对如何从递归返回正确的布尔值感到困惑。
在我下面的方法中,我总结了非空子集的所有可能组合,并且如果任何非空子集等于目标值,则希望将 True 返回到调用函数。问题是,由于存在多个递归调用堆栈,子集的布尔值的正确/预期值会被后续/剩余的递归调用堆栈覆盖。是否有解决此问题的方法?还是我使用蛮力? where-in 我将每个子集组合的所有可能的布尔值存储在一个列表中,如果列表中至少有一个值为布尔 True,则返回 true?
public class RecursionPossibleToAchieveTargetSum {
public static void main(String[] args ) {
long[] arr = {4,8};
long k = 4;
boolean flag = false;
if (arr.length > 0 )
flag = recursionHelper(arr,0,new long[arr.length],0, k);
System.out.println(flag);
}
public static Boolean recursionHelper(long[] arr, int spos, long[] temp, int tempIndex, long target) {
if ( spos == arr.length ) {
return (recursiveAddition(temp, temp.length - 1) == target);
}
recursionHelper(arr, spos + 1, temp, tempIndex, target );
temp[tempIndex] = arr[spos];
return recursionHelper(arr, spos + 1, temp, tempIndex + 1, target);
}
public static long recursiveAddition(long[] arr, int spos) {
if ( spos == 0 ) {
return arr[spos];
} else {
return arr[spos] + recursiveAddition(arr, spos-1);
}
}
}
答案 0 :(得分:0)
您可以使用 List
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
public class RecursionPossibleToAchieveTargetSum {
public static void main(String[] args ) {
long[] arr = {1,2,4,1,3,5};
long target = 8;
List<long[]> result = new ArrayList<long[]>();
if (arr.length > 0 ) {
result = recursionHelper(arr, target);
}
System.out.println(result.size() > 0);
for(long[] l : result) {
System.out.println(Arrays.toString(l));
}
}
public static List<long[]> recursionHelper(long[] arr, long target) {
List<long[]> result = new ArrayList<long[]>();
if (arr.length == 0) return result;
for(int j = arr.length; j > 0; --j) {
long nextsom = recursiveAddition(Arrays.copyOfRange(arr, 0, j));
if (nextsom == target) result.add(Arrays.copyOfRange(arr, 0, j));
}
result.addAll(recursionHelper(Arrays.copyOfRange(arr, 1, arr.length), target));
return result;
}
public static long recursiveAddition(long[] arr) {
if ( arr.length == 1 ) return arr[0];
return arr[0] + recursiveAddition(Arrays.copyOfRange(arr, 1, arr.length));
}
}
使用 arr = {1,2,4,1,3,5}
和 target = 8
的示例输出:
true
[1, 2, 4, 1]
[4, 1, 3]
[3, 5]