**汉诺塔**:汉诺塔是递归和分治的经典问题,而同学们也曾经在理解这个程序的时候遇到困难。遇到困难是正常的:C/C++ 中的 “函数” 和数学的函数很不一样,例如我们可以把 Fibonacci 数列的递归写成 ```c++ // 也可以 return f(n - 2) + f(n - 1); return f(n - 1) + f(n - 2); ``` 或是任意调换函数调用的次序,但汉诺塔不行。 不行的根本原因在于汉诺塔中的 printf 会带来全局的副作用。但 C/C++ 遵循 “顺序执行” 的原则,函数的执行有 “先后” (不像数学的函数,先后是无关的),按照不同顺序调用会导致程序输出不同的结果。而在具体实现时,每个栈帧中存放的 “当前执行的位置” (PC) 实现了顺序执行。