#java #string #recursion
#java #строка #рекурсия
Вопрос:
Я пытаюсь построить следующую строку, используя рекурсию в Java. Ожидаемый результат:
4! = 4!
= 4 * 3!
= 4 * 3 * 2!
= 4 * 3 * 2 * 1!
= 4 * 3 * 2 * 1 * 0!
Это мой факториальный метод:
public static String factorial(int n, int count, String equation)
{
if (n == 0) {
return equation = (n "!");
} else {
equation = (n - count);
return factorial(n - 1, count, equation);
}
}
Я ввожу следующий ввод в свой main
метод:
System.out.print(factorial(4, 0, ""));
В настоящее время он выводит строку «43210!» Я мало работал с рекурсией. Что я делаю не так?
Комментарии:
1. каков ожидаемый результат для вызова
System.out.print(factorial(4, 0, ""));
2.
equation = (n - count);
вы не встраиваете остальную часть инструкции в свою строку — вы просто добавляете число (например4
), когда хотите что-то вроде (4
3. Не уверен, чего именно вы пытаетесь достичь с помощью этой факториальной программы. Но математически n! равно
n X (n-1) X ... 1
. Например, 4! = 4 X 3 X 2 X 1. Однако вы делаете 4 3 2 1 .4. @VHS изменил операторы сложения на умножение. Это моя ошибка!
5. @KevinL Я попытался это сделать, и это дало мне результат, указанный в вопросе.
Ответ №1:
Я немного изменил ваш код, тогда код может достичь своих целей.вот код.Я надеюсь, что это может вам помочь.
public class Snippet {
public static String factorial(int n, String equation)
{
if (n == 0) {
return equation = (n "!");
} else {
equation = (n "*");
return factorial(n - 1, equation);
}
}
public static void factorial1(int n, String equation)
{
if(n < 0)
{
return;
}
System.out.println(equation n "!");
factorial1(n - 1, equation n "*");
}
public static void main(String [] arg)
{
System.out.println("4! ");
System.out.println(factorial(4, "="));
System.out.println();
factorial1(4, "=");
}
}
Ответ №2:
Если вы хотите достичь своей цели, используя только одну функцию рекурсии, для этого потребуется вложенная рекурсия. Возможно, вы захотите попробовать что-то вроде следующего:
public class Factorial {
public static void main(String[] args) {
System.out.println(factorial(4));
}
private static String factorial(int origNum, int lineNum, int innerLoopNum, String equation) {
if(innerLoopNum == origNum - lineNum) {
equation = equation innerLoopNum "!" "n";
}
else if(lineNum > origNum)
return equation;
else {
equation = equation innerLoopNum "*";
equation = factorial(origNum, lineNum, --innerLoopNum, equation);
return equation;
}
lineNum;
if(lineNum > origNum)
return equation;
return factorial(origNum, lineNum, origNum, equation);
}
public static String factorial(int n) {
return factorial(n, 0, n, "");
}
}
Ответ №3:
Предполагая, что n никогда не будет отрицательным, этого должно быть достаточно…
public String factorialString(int n) {
if (n == 0) return "0!";
return n " * " factorialString(n - 1);
}
Просто для удовольствия, вы также можете записать ее как:
public String factorialString(int n) {
return (n == 0)
? "0!"
: n " * " factorialString(n - 1);
}
Для заинтересованных людей я знаю, что я выполняю конкатенацию строк, и вместо этого я должен использовать StringBuilder . Задача состоит в том, чтобы продемонстрировать рекурсию здесь.