[将汉诺塔]这不是线性递归,这是个非线性递归!
n=1 1
n=2 3
n=3 7
.................
n=64
2的64次方减1 [这是个天文数字,就算世界上最快的计算机也解决不了
汉诺塔的复杂度是2的n次方减一
问题很复杂,恒真正解决问题的编码就只有三句
规约法回溯法递归法这是算法领域很重要的几种思路。
计算机把你360度扫描一下,但如果你有一次冲它笑了一次,计算机有傻眼了,又不认识了
但人则不一样,如果你当初深深的望了某人一眼,肯能若千年后也忘不掉!
#include <stdio.h>//将n个盘子从x借助y移动到z
void move(int n,char x, char y, char z){
/** 如果是1个盘子* 直接将A柱子.上的盘子从A移到C* 否则* 先将A柱子.上的n-1个盘子借助C移到B* 直接将A柱子上的盘子从A移到C* 最后将B柱子上的n-1个盘子借助A移到C .*/if (1 == n) {printf("%c-哈哈->%c\n",x,z);}else{move(n - 1, x,z, y); //将n-1个盘子从x借助z移到y上printf("%c-->%c\n", x,z); //将第n个盘子从x移到z上move(n - 1, y, x,z); //将n - 1个盘子从y借助x移到z上}
}int main(void) {int n;printf("请输入汉诺塔的层数: ");scanf_s("%d", &n);printf("移动的步骤如下: \n");move(n, 'x', 'y', 'z'); while (true){}return 0;
}