Как мне сделать рекурсивный метод, который принимает тип List, где выводом является другой List? - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь создать рекурсивный метод, который принимает List из Integer и возвращает новый List только с положительными числами оригинала List.

Так вот чтоЯ сделал

static List<Integer> positives(List<Integer> a) {
    if (a.getTail().isEmpty()) 
        return new List<Integer>(a.getHead(), new List<Integer>());

    if (a.getHead() - a.getHead() == 0) 
        new List<Integer>(a.getHead(), new List<Integer>());
        return positives(a.getTail());

    else
       return positives(a.getTail());

Итак, когда заголовок List положителен, он должен добавить его в новый список, а затем метод зацикливается.Если голова не позитивна, она просто зацикливается.Когда достигнут конец List, он должен вернуть список, содержащий положительные числа.

Я могу сказать, что с моим кодом в данный момент оператор isEmpty() возвращает совершенно другой список, чем оператор положительной проверки, в котором я ошибаюсь.Поэтому я не могу понять, как вернуть список из второго оператора if, когда цикл достиг конца List

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Я вижу три потенциальных проблемы с этим утверждением:

if (a.getTail().isEmpty()) 
    return new List<Integer>(a.getHead(), new List<Integer>());

Во-первых, мы возвращаем a.getHead(), даже не проверив, положительный или отрицательный. Во-вторых, мы создаем дополнительные List без видимой причины. В-третьих, мы пытаемся создать экземпляр интерфейса, а не класса? В этом if заявлении:

if (a.getHead() - a.getHead() == 0) 
    new List<Integer>(a.getHead(), new List<Integer>());
    return positives(a.getTail());

Мы усложняем тест a.getHead() >= 0 без видимой причины; мы снова создаем дополнительный List; мы создаем новую структуру, когда мы должны добавить к существующей структуре, возвращаемой positives().

(Не хватает .getHead() and .getTail()) Вот как я мог бы поступить об этом:

static List<Integer> positives(List<Integer> a) {
    List<Integer> non_negatives, tail = a.subList(1, a.size()); // tail = a.getTail()

    if (tail.isEmpty()) 
        non_negatives = new ArrayList<Integer>();  // need to create List to return
    else {
        non_negatives = positives(tail);
    }

    Integer head = a.get(0);  // head = a.getHead()

    if (head >= 0) 
            non_negatives.add(0, head);

    return non_negatives;
}
0 голосов
/ 26 января 2019

Предполагая, что вы не сошли с ума, и это либо классовый проект, либо значительно упрощенная версия чего-то, что на законных основаниях «требует» рекурсии, вот ответ.

Подсказка: метод, которыйвызывается клиентом не обязательно должен быть рекурсивным методом.

Некоторые кодоподобные вещи:

public class BlammyHoot
{
  public List<Integer> letsPretendRecursionIsRequired(final List<Integer> inputList)
  {
    final List<Integer> returnValue = new LinkedList<>();

    ... perform input validiation before entering the recursive method.

    theRecursiveMethod(inputList, returnValue);

    return returnValue;
  }

  private void theRecursiveMethod(
    final List<Integer> sourceList,
    final List<Integer> destinationList)
  {
    ... do your recursive thing here.
  }
}
0 голосов
/ 26 января 2019

Самый короткий путь, хотя и не рекурсивный, - использование потоков

List<Integer> posList = a.stream().filter(x -> x > 0).collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...