Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将值从内部递归方法传递到外部方法_Java_Arrays_Recursion_Sum_Powerset - Fatal编程技术网

Java 将值从内部递归方法传递到外部方法

Java 将值从内部递归方法传递到外部方法,java,arrays,recursion,sum,powerset,Java,Arrays,Recursion,Sum,Powerset,我找到了下面的方法,从中打印数组中的所有子集,这些子集的总和为某个数字 我的代码中充满了用于跟踪递归调用的print语句: public static void find(int[] A, int currSum, int index, int sum, int[] solution, int tot) { if (currSum == sum) { tot +=1; System.out.println("\nS

我找到了下面的方法,从中打印数组中的所有子集,这些子集的总和为某个数字

我的代码中充满了用于跟踪递归调用的print语句:

public static void find(int[] A, int currSum, int index, int sum,
        int[] solution, int tot) {
    if (currSum == sum) {
                    tot +=1;

        System.out.println("\nSum found ");
        for (int i = 0; i < solution.length; i++) {
            if (solution[i] == 1) {
                System.out.print("  " + A[i]);
            }
        }

    } else if (index == A.length) {
                System.out.println("reached end");
        return;
    } else {
        solution[index] = 1;// select the element
        currSum += A[index];
                    System.out.println("incr " + A[index] + "  "+ currSum + " ");
        find(A, currSum, index + 1, sum, solution, tot);
        currSum -= A[index];
                    System.out.println("decr " + A[index] + "  "+ currSum + " ");
        solution[index] = 0;// do not select the element
        find(A, currSum, index + 1, sum, solution, tot);
    }
    return;            
}
公共静态void find(int[]A,int currSum,int index,int sum,
int[]解决方案,int tot){
如果(currSum==总和){
tot+=1;
System.out.println(“\nSum-found”);
for(int i=0;i
我想修改这个方法,这样它最终也会打印出最终的解决方案数。 我知道这个问题已经在Stackoverflow上讨论过了,我发现了一些有趣的解决方案。然而,我想知道是否有一种方法可以修改这个特定的方法。
我的想法是创建一个整数“tot”,一旦找到解决方案,我就将其加1,然后将更新后的值传递给每个递归调用。但最终值将在其中一个内部递归调用中找到,我不知道如何将最终值传递给外部方法。

如果希望在递归调用中获得解决方案计数,最好的方法是在每个方法调用中传递可变引用。一旦您得到解决方案,更新可变引用。在这里,可变引用很重要,因为:

  • 原语类型很难通过递归调用传播,因为返回类型需要相应地维护和更新
  • 不可变类型(如
    Integer
    )不会在递归调用中维护值
  • 解决方案:

  • 使用原子整数
  • 使用原语
    int
    数组
  • 两者都能解决你的问题。您应该检查
    null
    引用或数组长度,以使其不易出错。样本如下:

    private static void methodWithAtomicInteger(AtomicInteger i){
        i.incrementAndGet();
    }
    
    private static void methodWithIntArray(int[] i){
        i[0]++;
    }
    
    public static void main(String[] args){
        AtomicInteger integer = new AtomicInteger(0);
        System.out.println(integer);
        methodWithAtomicInteger(integer);
        System.out.println(integer);
    
        int[] values = new int[]{0};
        System.out.println(values[0]);
        methodWithIntArray(values);
        System.out.println(values[0]);
    }
    

    很乐意帮忙:)