Создайте функцию рекурсии с помощью Java, которая печатает все возможные последовательности элементов, содержащихся в списке.

#java #list #recursion #sequence

#java #Список #рекурсия #последовательность

Вопрос:

Предполагается, что я создаю рекурсивную функцию в Java, которая выводит все возможные цвета из списка цветов. Например{r, b, g; r, g, b; g, r, b; g, b, r} и т.д…

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

 import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SequentialPrint {
    private List colors;
    private List prefix;

    public SequentialPrint(List colors) {
        this.colors = colors;

    }

    public void printAllSequences(List colors) {
        int prefixCount = 0;
        int colorCount = 0;
        List prefix = new ArrayList();
        if (colors.isEmpty() || prefixCount == colors.size()) { //Base Case
            System.out.print("All Sequences Printed");
        }
        else {
            Object color = colors.remove(0);
            prefix.add(color); //add first color from colors list.
            prefixCount  ; //increases prefix counter
            while (prefixCount <= colors.size()   1) { //prints first rotation of colors
                System.out.println(prefix);
                System.out.print(colors);
                while (colorCount < colors.size() - 1) { //rotates list and prints colors, until entire list has been rotated once.
                    Collections.rotate(colors, 1);
                    System.out.println(prefix);
                    System.out.print(colors);
                }
            }
        }

    }

}



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

/**
 * @author Cash
 *
 */
public class SequentialPrintDemonstration {
    private SequentialPrint colorSequence;
    private List colorsList;
    private List prefixList;

    /**
     * @param args
     */
    public SequentialPrintDemonstration() {

        List colorsList = new ArrayList();

        colorsList.add("blue");
        colorsList.add("green");
        colorsList.add("red");
        colorsList.add("yellow");
        colorSequence = new SequentialPrint(colorsList);
        System.out.println(colorsList);


    }

    public void execute() {
        this.colorSequence.printAllSequences(colorsList);
    }

}
  

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

1. Опубликуйте трассировку стека; она точно сообщит вам, в какой строке и в каком файле встречается NPE. Затем откройте файл в вашей IDE, перейдите к этой строке и найдите разыменованные объекты. Один из них равен null — вам нужно выяснить, где вы не смогли правильно его инициализировать. NPE — одна из самых простых ошибок для выявления.

2. Похоже, что ваш код вообще не использует рекурсию. Он использует итерацию.

3. Мне кажется, что вы слишком много думаете обо всем этом. ЕСЛИ ВЫ НАХОДИТЕСЬ В КЛАССЕ, В КОТОРОМ, Я ДУМАЮ, ВЫ НАХОДИТЕСЬ … тогда вот вам мой совет… Прочитайте примечания к справке, которые профессор опубликовал вместе с этим домашним заданием. Он поставляется с кодом решения в psuedocode!

4. Я обдумывал все, что вы правы. Впоследствии я смог решить всю проблему.

Ответ №1:

Ваш класс имеет закрытый элемент данных с именем prefix, который вы не инициализируете в конструкторе:

 public class SequentialPrint {
    private List colors;
    private List prefix;

    public SequentialPrint(List colors){
        this.colors = colors;  // what if the array you pass in is null?
        // why not initialize prefix here?  it's null if you don't.
    }
  

Тогда у вас есть метод, который объявляет список локальных переменных с именем prefix:

 public void printAllSequences(List colors){
    int prefixCount = 0;
    int colorCount = 0;
    List prefix = new ArrayList();  // this one shadows the private data member
  

Вы имеете в виду использовать здесь элемент private data?

Почему вы передаете цвета? Как это связано с закрытым элементом данных?

Я не понимаю этот код после быстрого просмотра. А вы?