Если вы напечатаете его в виде дерева, вы получите что-то вроде этого:
main
|--> hanoi(3, ...)
| |
| |--> hanoi(2, ...)
| | |
| | |--> hanoi(1, ...)
| | |--> hanoi(1, ...)
| |<----|
| |--> hanoi(2, ...)
| | |
| | |--> hanoi(1, ...)
| | |--> hanoi(1, ...)
| |<----|
|<-----|
|
Для каждого вызова hanoi(m, ...)
он будет удерживать вызов hanoi (m - 1, ...) дважды, если только не m == 1. Во время первого вызова он снова вызовет вызов hanoi (m - 1, ...) ... до тех пор, пока m не станет равным 1.
Поэтому, возвращаясь назад, когда m равно 2, он будет вызывать Ханой (1,...) два раза подряд:
hanoi(2, ...)
hanoi(1, ...)
hanoi(1, ...)
Когда m равно 3, два раза подряд будет вызываться Ханой (2, ...), следовательно:
hanoi(3, ...)
hanoi(2, ...)
hanoi(1, ...)
hanoi(1, ...)
hanoi(2, ...)
hanoi(1, ...)
hanoi(1, ...)