递归返回值

时间:2021-01-11 17:43:41

标签: java recursion

有人可以帮我看看下面的递归代码吗?

给定一个输入数组和一个目标,我想为任何与目标值相加的非空子集返回一个布尔值 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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用 List 来保存所有与目标相加的子集。我也清理了一些递归。您可以使用“result.size() > 0”检查此结果列表的大小并打印该布尔值。您还可以打印每个子集数组以了解有哪些子集。

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]