Вы должны помнить, что у вас не будет просто одного вызова - у вас будет вложенных вызовов. Таким образом, когда «наиболее высоко вложенный» вызов немедленно возвращается (когда он находит только «o»), следующий уровень вверх займет str.charAt(0)
- где str
- это «lo» в этой точке. Так что вернусь "ол".
Затем уровень next получит "ol", выполните str.charAt(0)
для его значение str
(что означает "llo"), возвращая "oll" в следующий уровень.
Тогда уровень next получит «oll» от своего рекурсивного вызова, выполняя str.charAt(0)
для его значение str
(что означает «ello»), возвращая "olle" на следующий уровень.
Тогда уровень final получит «oll» от своего рекурсивного вызова, выполняя str.charAt(0)
для его значение str
(что «привет»), возвращая "olleh" для первоначального абонента.
Может иметь смысл думать о стеке по ходу дела:
// Most deeply nested call first...
reverse("o") -> returns "o"
reverse("lo") -> adds 'l', returns "ol"
reverse("llo") -> adds 'l', returns "oll"
reverse("ello") -> adds 'e', returns "olle"
reverse("hello") -> adds 'h', returns "olleh"