先写一个空函数
- int func(int n) {
- //...
- return 0; //必须有return,否则无法通过编译
- }
复制代码
代码有n个圆盘时,需要操作的步骤。然后我们一步一步向其中添加代码:
首先,有1个圆盘时,很明显只需要1步,所以有:
- int func(int n) {
- if (n == 1) {
- return 1;
- }
- else {
- //...
- }
- return 0;
- }
复制代码
其次,圆盘数目大于1时,首先需要将上面的n-1个圆盘移动到第三根柱子,然后将底部圆盘移动到目标柱子,最后将那n-1个圆盘移动回来:
那么另一部分的代码就可以写成
- int func(int n) {
- if (n == 1) {
- return 1;
- }
- else {
- int step_count = 0;//记录步数
- step_count += func(a - 1); //移动上面的n-1个圆盘
- step_count += 1; //移动最下面的圆盘
- step_count += func(a - 1); //移动最上面的n-1个圆盘
- return step_count;
- //...
- }
- return 0;
- }
复制代码
最后,考虑程序的完整性,在输入不合法(小于1)时,返回一个代表错误的值,一般是-1,然后把程序化简,可以得到
- int func(int n) {
- if (n < 1) {
- return -1; //考虑输入不合法的情况,返回-1代表错误
- }
- else if (n == 1) {
- return 1;
- }
- return 2 * func(n - 1) + 1;
- }
复制代码
这就是汉诺塔需要的递归代码了