Первое, что вы делаете в рекурсии, это печатаете элемент, а затем рекурсивно вызываете функцию.
Давайте посмотрим на стек вызовов рекурсии. [мы будем обозначать каждый рекурсивный вызов его аргументом a
]
Сначала вы вызываете метод только с одним элементом
| |
|1|
---
вы напечатаете «1» и вызовете рекурсивный вызов с 2, теперь верх будет:
|2|
|1|
---
Вы вводите метод снова и печатаете элемент, 2
, и повторно вызываете с 3, и получаете:
|3|
|2|
|1|
---
продолжите эту логику, и вы закончите печатью 1,2,3,4 и получите трассировку стека:
|5|
|4|
|3|
|2|
|1|
---
Теперь условие не выполняется, поэтому вы печатаете только fin, а return - приводит к выталкиванию первого элемента:
|4|
|3|
|2|
|1|
---
когда вы возвращаетесь из рекурсивного вызова, вы печатаете верхнюю часть + 1 [5
], а затем fin
и снова извлекаете элемент из заголовка трассировки стека и получаете:
|3|
|2|
|1|
---
Теперь снова вы печатаете заголовок + 1: 4
и fin
и вставляете еще один элемент ....
Продолжайте эту логику, пока стек не станет пустым, и вы получите именно то, что напечатала программа!