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

时间:2017-05-24 13:05:31

标签: java arrays recursion sum powerset

我从http://algorithms.tutorialhorizon.com/dynamic-programming-subset-sum-problem/找到了以下方法,它打印了一个总和为某个数字的数组中的所有子集。

我的代码中充满了用于跟踪递归调用的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;            
}

我想修改方法,以便最后打印最终数量的解决方案。 我知道这个问题已在Stackoverflow上讨论过,我发现了一些有趣的解决方案。不过,我想知道是否有办法修改这种特殊方法。 我的想法是创建一个整数“tot”,我在找到解决方案后立即将其添加1,然后将更新的值传递给每个递归调用。但最终值将在其中一个内部递归调用中找到,我不知道如何将最终值传递给外部方法。

1 个答案:

答案 0 :(得分:1)

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

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

    1. 使用AtomicInteger
    2. 使用原始int数组
    3. 两者都能解决您的问题。您应检查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]);
      }