Мне нужно сделать этот метод более рекурсивным, чтобы сделать его расширяемым.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Мне нужно сделать этот метод более рекурсивным, чтобы сделать его расширяемым.

Сообщение Anonymous »

Я написал функцию, которая использует список символов, а затем возвращает список всех перестановок этих символов, в которых ни один символ заданной длины не повторяется. В конце концов я хочу изменить его так, чтобы список символов был вводом, а не был жестко запрограммирован, но это не самая фундаментальная проблема, с которой мне нужна помощь.
Этот код работает для последовательностей символов длиной 1, 2 или 3, но если я продолжу писать его таким образом, чем больше я буду увеличивать максимальную длину, тем больше, неуклюже и повторяемо будет становиться все больше и больше повторяющихся символов. Я интуитивно чувствую, что должен быть какой-то рекурсивный способ сделать это более эффективно, но мне сложно понять, как именно.
Код написан на Java 11.

Код: Выделить всё

import java.util.ArrayList;
import java.util.Arrays;

//Pretend the class wrapper is here

public static ArrayList five6789Scramble(byte length) {
        /*Returns all non-repeating permutations of the characters in charSet that don't start with the zero index
        character
         */
        if(length < 0) {
            System.out.println("input length for five6789Scramble must not be negative");
            throw new IndexOutOfBoundsException();
        }
        ArrayList charSet = new ArrayList(
                Arrays.asList('a','b','c','d','e','f','g','h','i','j'
                ));
        if(length>charSet.toArray().length) {
            System.out.println("length specified for five6789Scramble is too long");
            throw new IndexOutOfBoundsException();
        }
        ArrayList ret = new ArrayList();
        for (byte i=1; i 1) {
                ArrayList remainingChars = new ArrayList(charSet);
                remainingChars.remove(i);
                ArrayList toAddStarter = new ArrayList();
                toAddStarter.add(charSet.get(i));
                for (byte j=0; j 2) {
                        ArrayList toAddStarterTwo = new ArrayList(toAddStarter);
                        toAddStarterTwo.add(remainingChars.get(j));
                        ArrayList remainingCharsTwo = new ArrayList(remainingChars);
                        remainingCharsTwo.remove(j);
                        for(byte k=0; k 3)», который копирует код из блока «if (длина > 2)»? В конечном итоге я хочу получить длину 10, даже несмотря на то, что в результате вы получите 3 265 920 массивов длиной десять.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»