想成整体问题,1.先移n-1,2.再移n,3.最后将n-1移到n上
#include <stdio.h>
void move(char A, int n, char C)
{
printf("%d,%c,%c\n", n, A, C);
}
void Hanoi(int n, char A, char B, char C)\\将n个圆盘从A柱移至C柱
{
if (n == 1)
move(A, 1, C);
else
{
Hanoi(n - 1, A, C, B);\\将n-1个圆盘从A移至B,C为工具柱
printf("The first A,B,C address is %ld %ld %ld\n", &A, &B, &C);
move(A, n, C);\\将序号为n的圆盘从A移至C
Hanoi(n - 1, B, A, C);\\将n-1个圆盘从B移至C,A为工具柱
printf("The next A,B,C address is %ld %ld %ld\n", &A, &B, &C);
}
}
int main()
{
printf("The first test.\n");
Hanoi(2, 'A', 'B', 'C');
printf("The next test.\n");
Hanoi(3, 'A', 'B', 'C');
return 0;
}
1.自顶向下:逐渐求精,函数调用,把大问题分解成小问题。
2.递归与分治:基础与归纳,把原问题分解成子问题,但仍与原来一样。
3.不要跨层分析:不向下考虑。
4.形参与实参:(代码跟踪),形参是名称,实参是值。
5.有意义、规范的标识符:增强代码的可读性。
6.时间复杂度
7.递归栈(代码跟踪)
8.空间复杂度