Рекурсивная java функция для повторения начала и конца слова «вычисление» - PullRequest
0 голосов
/ 30 мая 2020

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

В данный момент консоль печатает:

compcompcomputingtingting

но это должно быть:

computing вычисление компьютер compcompcompcompputingting

public static String madComputing(int n) {
    if (n < 0)
        return "Must be postive integer";// printing to present error instead getting error in console
    if (n > 1000)// avoid overflow
        return "Cannot be greater than 1000";

    if (n > 0) {
        //System.out.print("computing");
        return "comp" + madComputing(n - 1) + "ting" ;
    } else
        return "u";
}

Ответы [ 3 ]

1 голос
/ 30 мая 2020

Я постараюсь вам это объяснить, а не дать быстрый ответ. Похоже, у вас есть все базовые случаи, и ваша проблема может быть исправлена ​​с помощью нескольких небольших настроек:

Я думаю, что основная проблема с вашим кодом заключается в том, что вы не печатаете / не создаете новый вывод каждый раз. рекурсивный вызов - ваши рекурсивные вызовы просто каждый раз добавляются к одной и той же строке. Вы можете сказать, что вам нужно что-то напечатать при каждом рекурсивном вызове, потому что ваш идеальный вывод показывает не только конечную строку, но и приращения между ними.

Итак, при каждом рекурсивном вызове вы распечатываете свой результат так far, а затем передать этот промежуточный результат следующему рекурсивному вызову. Это означает, что ваш метод должен принимать параметр (или 2), который до сих пор будет результатом (аккумулятор)

Теперь вопрос в том, как выглядит промежуточный результат? Это будет то, что будет меняться между каждым выходом, то есть «comp перед« u »и« tings »после. Таким образом, вы можете передать строковые параметры «до» и «после» (которые будут пустыми строками при первом вызове), которые на данный момент содержат строку из comp и ting.

Затем при каждом вызове вам просто нужно добавить 'comp' к строке before, 'ting' к строке after, распечатать все это с 'u' в середине (перед + ' u '+ after), а затем передать строки new before и after рекурсивному вызову

Edit после дальнейшего уточнения: делать это без аккумулятора :

Если вам нужно выполнить sh это без аккумулятора, это немного сложнее:

  1. Базовым случаем должно быть «вычисление» вместо «u»
  2. Для не базового случая сначала выполните рекурсивный вызов (т.е. вызовите метод с n-1) и сохраните его как строку (скажем, recc_result)
  3. Разделите рекурсивный результат по новой строке \n и вытащите из него последнюю строчку. Это можно сделать, используя recc_result.split(), а затем взяв последний элемент массива. Назовите это last_line
  4. Наконец, верните recc_result + '\n' + 'comp' + last_line + 'ting'

Объяснение:

Изменение базового случая связано с тем, что вы хотите напечатать «вычисление», когда n = 1, а не только «u».

Остальное можно понять так, что на каждом этапе вы берете последнюю строку из результата и добавляете «comp» к front и «ting» в конце, затем прикрепив это к результату.

Итак, базовый случай - «вычисление». Затем для n = 2 мы получаем рекурсивный результат для n-1 (который равен 1), который дает нам «вычисления». Последняя строка из этого результата является единственной строкой (т.е. «вычисление»). Затем мы добавляем "comp" и "ting" и присоединяем их ко всему результату, давая нам "вычисление \ nкомпьютерные вычисления".

Для n = 3 recc_result - это "computing \ ncompcomputing", из которого мы берем последнюю строку ("compcomputingting"), а затем добавляем вычисление и ting "compcompcomputingting" и присоединяем его ко всему результату, давая "вычисления \ nкомпьютерные вычисления \ nкомпьютерные вычисления"

Примечание: \n = новая строка

0 голосов
/ 06 июля 2020
public static String madComputing(int n) {
    String res = "";
    String half = "";
    if (n < 0)
        return "Has to be positive";
    if (n > 1000)
        return "Stackoverflow for values greater than 999";
    if (n > 1) {// anything larger than 1
        res = "" + madComputing(n - 1);// assign the recursive call to var res to split and access it's substring
        // System.out.println(res); if you leave this in, it will print at each level
        half = res.substring(res.lastIndexOf("\n") + 1);// get the last indexed value
        return "comp" + half + "ting";// use half to complete my method which will print for any n less than 1000
    } else {
        return "computing";// this is the base case when n == 1
    }

}
0 голосов
/ 30 мая 2020

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

Это выглядит очень плохим кодом, но все равно выполняет свою работу:

public static String madComputing(int n, String acc) {
  if (n < 0) {
      return "Must be postive integer";
  }
  if (n > 1000) {
      return "Cannot be greater than 1000"; 
  }   
  if (n > 0) {
      System.out.println(acc);
      acc = "comp" + acc + "ting";
      return madComputing(n - 1, acc);
  } else {
    return ""; 
  }  
}

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

public static String madComputing(int n) {
  if (n < 0) {
      return "Must be postive integer";
  }
  if (n > 1000) {
      return "Cannot be greater than 1000"; 
  }   
  if (n >= 0) {
      String value = "comp" + (n == 0 ? "u" : madComputing(n - 1))+ "ting";
      System.out.println(value);      
      return value;
  } 
  return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...