В следующей инструкции return
есть две части:
return reverse(userStr.substring(1)) + userStr.charAt(0)
Вторая часть, userStr.charAt(0)
- это та, которая собирается в окончательный результат.
Первая часть, reverse(userStr.substring(1))
- это рекурсивный вызов функции с новым аргументом userStr.substring(1)
. Эта часть предназначена просто для того, чтобы функция вызывалась до тех пор, пока в параметре не останется другого символа, или, другими словами, продолжайте работать, пока все символы не будут собраны в окончательный результат.
Когда вы думаете о рекурсивный вызов, подумайте о стеке (который является последним первым полученным). В этом смысле, поскольку O
будет последним символом, который будет помещен в стек, он будет первым неиспользуемым символом.
Самый простой способ понять, как работает рекурсивный метод, - это проследить значения аргументы и параметры например
import java.util.Scanner;
public class Recursion {
public static void main(String args[]) {
String userStr = " ", userAlt = " ";
int position = 0, length = userStr.length() - 1;
@SuppressWarnings("resource")
Scanner scan = new Scanner(System.in);
System.out.println("Please enter a string.");
userStr = scan.nextLine();
userAlt = reverse(userStr);
System.out.println("\n" + userStr + " is... \n" + userAlt + " backwards!");
}
public static String reverse(String userStr) {
if (userStr.isEmpty()) {
System.out.println("userStr when it userStr is empty: " + userStr);
return userStr;
} else {
System.out.println("userStr when userStr is not empty: " + userStr);
System.out.println("userStr.substring(1) when userStr is not empty: " + userStr.substring(1));
System.out.println("userStr.charAt(0) when userStr is not empty: " + userStr.charAt(0));
return reverse(userStr.substring(1)) + userStr.charAt(0);
}
}
}
Пример прогона:
Please enter a string.
hello
userStr when userStr is not empty: hello
userStr.substring(1) when userStr is not empty: ello
userStr.charAt(0) when userStr is not empty: h
userStr when userStr is not empty: ello
userStr.substring(1) when userStr is not empty: llo
userStr.charAt(0) when userStr is not empty: e
userStr when userStr is not empty: llo
userStr.substring(1) when userStr is not empty: lo
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: lo
userStr.substring(1) when userStr is not empty: o
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: o
userStr.substring(1) when userStr is not empty:
userStr.charAt(0) when userStr is not empty: o
userStr when it userStr is empty:
hello is...
olleh backwards!
Теперь вы можете увидеть, как 'o' + 'l' + 'l' + 'e' + 'h' = "olleh"
сформирован.