Java реверсивно печатать массив в обратном порядке - PullRequest
0 голосов
/ 28 сентября 2011

массив представляет собой массив строк.массив {"hello", "how", "are", "you", "?"}

это вроде работает, но он единственное, что распечатка смешивает последние 2 элемента, и когда я запускаю свою программу, распечатка получается как you ? are how hello, это должно быть ? you are how hello.

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

любая помощьбудет оценено.или почему он печатает неправильно?Разве это не делает рекурсию?

Это мой метод, это должно быть сделано с разделяй и властвуй

public void outrev()
{ 

    outrev(0,a.length-1);
} 

private void outrev(int left, int right)
{

    System.out.println("left a[" + left + "] is " + a[left]);
    System.out.println("right a[" + right + "] is " + a[right]);

    int mid;
    if(left > right)
    {
    //do nothing
    }

    else if(left == right)
    {
    System.out.print(a[left]);
    }

    else
    {
    mid = (left + right) / 2;



    outm(mid+1, right);
    System.out.print(a[mid] + " ");
    outm(left, mid-1);


    }
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2011
public void outrev()
{ 
    List<String> arr = Arrays.asList(a);
    outrev(arr);
} 

private void outrev(List<String> arr)
{

    System.out.println(arr.get(arr.size() - 1));
    if(arr.size() != 1){
        outrev(arr.subList(0, arr.size() - 1));
    }
}

Вы должны импортировать

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

Не знаю, если это нарушает правила вашей домашней работы.Заметьте, что outrev вызывает себя, но перестает вызывать себя, когда список занимает один элемент?Это основной арендатор рекурсии, то есть функция, которая вызывает себя и имеет условие завершения.В вашем исходном коде outrev на самом деле не вызывает себя;однако вы перегружаете outrev в одном случае, но это отличается от рекурсии - если только outm, который вы не определили, не предназначался для вызова outrev.

Вам также необходимо выполнить эту проверку программы, чтобы выполнитьубедитесь, что список не пустой, так как ваш учитель может бросить это в вас, и в этом случае код потерпит неудачу.

Помните, что при рекурсии лучше думать о: 1) Чтоделать, когда у меня ноль предметов.2) Что делать, когда у меня есть один предмет.3) Как обработать любой другой случай, когда в моем списке более одного элемента.

0 голосов
/ 28 сентября 2011

У вас есть правильная идея для вашего рекурсивного алгоритма "разделяй и властвуй".Основная идея заключается в следующих действиях:

  1. Разделить массив пополам:
  2. Рекурсивная печать правой половины
  3. Рекурсивная печать левой половины

Вы затрудняете себя, печатая «середину».Вместо этого вам следует выполнять печать только тогда, когда вы достигли условия завершения, то есть когда вы не можете разбить массив пополам, поскольку у вас есть только 1 элемент.

Кроме того, ваш код содержит определения методовoutrev() и outrev(int left, int right), но без определения outm(int left, int right), поэтому опубликованный код не компилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...