Как использовать рекурсивный метод с возвращаемым типом void в java?

Итак, я понимаю, как использовать рекурсивный метод, который имеет другой тип возвращаемого значения, отличный от void. Обычно я вызывал бы тот же метод снова в том же методе (внутри рекурсивного случая), уменьшая или увеличивая некоторое значение в вызове, чтобы достичь базового случая. Затем в какой-то момент достигается базовый случай и проблема решается, поэтому он начинает возвращать значение при каждом вызове. По этим линиям.

НО
Что делать, если метод имеет тип возвращаемого значения void, поэтому вы не можете вызвать метод, поскольку он ничего не вернет? Я пытаюсь написать предложение задом наперед, которое я решил как с помощью цикла for, так и с помощью метода восстановления, который может возвращать строковое значение, но я не уверен, как к нему подойти, если оно недействительно, что и является назначением запрашивается.
Изменить: я также должен упомянуть, что предложение может быть передано только в параметре

Спасибо всем за информацию и помощь!


person pudge    schedule 28.02.2016    source источник
comment
Используйте объект уровня класса для хранения данных рекурсии. Плохая практика, поскольку будет сложно отследить проблемы с рекурсией/будет сложно реализовать рекурсию, поскольку ваш объект все время мутирует. В основном используйте его для простых случаев, таких как суммы/конкатенация.   -  person Norbert van Nobelen    schedule 29.02.2016


Ответы (3)


Рекурсия работает не только с методами/функциями, которые возвращают значения. Рекурсия означает только то, что метод/функция вызывает сам себя.

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

Я не полностью осведомлен о задаче, которую вы пытаетесь выполнить, но вот пример рекурсивной функции, которая записывает строку задом наперед. Я использую ПСЕВДО-функции с именами, которые, надеюсь, говорят сами за себя.

public void writeBackwards(String str) {
    // This is the negation of the stop condition, so the stop condition
    // is when the string is empty, in which case this function will do
    // nothing:
    if (!str.isEmpty()) {
        char firstCharacter = str.getFirstCharacter();
        str = str.removeFirstCharacter();
        writeBackwards(str); // the recursive call
        // The following operation will be pending, waiting for the
        // recursive call to be resolved first:
        writeCharacter(firstCharacter);
    }
}
person CesarPim    schedule 28.02.2016
comment
Спасибо. Думаю, я был так сосредоточен на этом, что мне нужно было что-то вернуть. В итоге я использовал переменную в качестве держателя пробела для символа. Он будет печатать этот символ с последней позиции до начала, пока не будет достигнут базовый регистр позиции символа 0. Таким образом, переменная будет последним символом, напечатайте эту переменную, а затем снова вызовите функцию минус 1 позиция. Я посмотрел на предыдущие примеры, которые кажутся сложными, но это было очень просто. - person pudge; 29.02.2016

Вы можете использовать любой изменяемый объект в качестве параметра рекурсивной функции для сохранения результата. Например, упомянутая вами задача с обратным предложением может быть записана так:

public void stringReverse(String s, int index, StringBuilder sb) {
    if (index < 0)
        return;
    sb.append(s.charAt(index));
    stringReverse(s, index - 1, sb);
}

И звонил так

StringBuilder sb = new StringBuilder();
stringReverse(mySentence, mySentence.length() - 1, sb);
person radoh    schedule 28.02.2016

Как и в C++, вы можете передавать указатели, здесь, в Java, вы можете просто передать объект класса в свою функцию, чтобы хранить значение, сгенерированное рекурсивными вызовами функции. Ниже приведен простой пример, отражающий ваш вопрос о вычислении числа Фибоначчи.

public class ComputeFibonacci {
  static class Fibonacci {
    public int ith;
    public int value;
    Fibonacci(int a, int b) {
      ith = a;
      value = b;
    }
  }

  private static void fibonacci(Fibonacci result) {
    if (result.ith == 1 || result.ith == 2) {
      result.value = 1;
    } else {
      Fibonacci left = new Fibonacci(result.ith - 1, 0);
      Fibonacci right = new Fibonacci(result.ith - 2, 0);
      fibonacci(left);
      fibonacci(right);
      result.value = left.value + right.value;
    }
  }

  public static void main(String[] args) {
    // Here we compute the 10th fibonacci number
    Fibonacci f = new Fibonacci(10, 0);
    fibonacci(f);
    System.out.println("The result is " + f.value);
  }
}

Удачи.

person SSDong    schedule 28.02.2016