Попытка построить строку с использованием рекурсии в Java

#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 . Задача состоит в том, чтобы продемонстрировать рекурсию здесь.