Возвращает массив из k-последующего из n-массива в рекурсивной функции

#java #recursion #combinations

#java #рекурсия #комбинации

Вопрос:

У меня есть следующий код, в котором prints весь k-subsequent массив size n

 import java.util.*;

public class Main {
    public static void main(String[] args){
        int[] arr = {1,2,3,4,5,6};
        int k = 3;
        int start= 0;
        List<int[]> subs = subseq(arr, k, 0, new int[k]);
        
        for(int[] s : subs)
            System.out.println(Arrays.toString(s));
    }

    static List<int[]> subseq(int[] arr, int len, int start, int[] result){
        List<int[]> rez = new ArrayList<>();
        if (len == 0){
             /* PRINT HERE WORKS FINE IT PRINT EACH SUBSEQUENT CORRECTLY*/
            //System.out.println(Arrays.toString(result));
            rez.add(result);
            return rez;
        }       
        for (int i = start; i <= arr.length-len; i  ){
            result[result.length - len] = arr[i];
            subseq(arr, len-1, i 1, result);
        }
        return rez;
    }       
}
 

Моя проблема в rez List том, что это returned в recursive функции, это всегда empty , может ли кто-нибудь помочь это исправить? Я перепробовал много решений, ни одно из которых не сработало

Комментарии:

1. @JoakimDanielson хорошо, не могли бы вы это исправить? также ответ, данный в Tarun , не работает, я не знаю, почему он unomment строка, которая находится внутри if(len == 0) , потому что я уже разместил это, чтобы показать это print it work there , но мне нужно напечатать внутри main method , не могли бы вы, пожалуйста, удалить его ответ, потому что я не могу

2. @JoakimDanielson извините, просто потому, что я не могу удалить или проголосовать за это, я бы хотел, чтобы вы могли его удалить

Ответ №1:

По сути, вы создавали новый arraylist для хранения всех последовательностей.Вам нужно создать единый результирующий arraylist, в котором будут храниться все массивы. При добавлении в res я создал новый массив, чтобы он не заменял предыдущие добавленные массивы. Ниже приведено рабочее решение

 import java.util.*;

public class Main {
    public static void main(String[] args){
        int[] arr = {1,2,3,4,5,6};
        int k = 3;
        int start= 0;
        Main obj = new Main();
        List<int[]> rez = new ArrayList<>();
        obj.subseq(arr, k, start, new int[k], rez);
       
        for(int[] s : rez)
         System.out.println(Arrays.toString(s));
    }

    public void subseq(int[] arr, int len, int start, 
int[] result, List<int[]> 
 res){
        if (len == 0){
             /* PRINT HERE WORKS FINE IT PRINT EACH SUBSEQUENT CORRECTLY*/
         // System.out.println(Arrays.toString(result));
          int[] a = new int[result.length];
            for(int i = 0; i < result.length; i  ) {
                a[i] = result[i];
          }
            
            res.add(a);
               
            return;
        }       
        for (int i = start; i <=arr.length-len; i  ){
            result[result.length - len] = arr[i];
            subseq(arr, len-1, i 1, result,res);
        }         
    }       
}