Возвращает значения из рекурсии

#java #recursion

#java #рекурсия

Вопрос:

Не мог бы кто-нибудь, пожалуйста, помочь мне с приведенным ниже кодом рекурсии?

Учитывая входной массив и цель, я хочу вернуть логическое значение true для любого непустого подмножества, которое суммируется с целевым значением. Я не понимаю, как вернуть правильное логическое значение из рекурсии.

В моем подходе ниже я суммирую все возможные комбинации непустого подмножества и хочу вернуть True вызывающей функции, если какое-либо из непустых подмножеств равно целевому значению. Проблема в том, что из-за нескольких стеков рекурсивных вызовов правильное / ожидаемое значение для логического значения для подмножества перезаписывается последующими / оставшимися стеками рекурсивных вызовов. Есть ли обходной путь для этой проблемы? Или мне использовать грубую силу? где я храню все возможные логические значения для каждой комбинации подмножеств в списке и возвращаю 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. Где ваш код для recursionHelper?

2. Это ниже основной функции. Имя функции было усечено при копировании кода из IDE. Это приведено ниже: 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]; возвращает recursionHelper(arr, spos 1, temp, tempIndex 1, target); }

3. по сути, имя функции «targetSum» на самом деле является «recursionHelper». Это была опечатка с моей стороны при редактировании и форматировании кода.

4. @maverickcoder добро пожаловать в stack overflow. Это помогает / экономит время для тех, кто ищет, если вы отредактируете этот метод в своем вопросе вместо добавления в комментарии.

5. спасибо, исправил опечатку в моем коде выше.

Ответ №1:

Вы можете использовать список <long[]>, чтобы сохранить все подмножества, которые в сумме составляют цель. Я также немного очистил рекурсию. Вы можете проверить размер этого списка результатов с помощью «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 resu<

        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 resu<
    }

    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]