我在汉诺塔问题递归的思想是什么?
想通了。
还记得我们高中时候如何使用数学归纳法吗?
我们先证明 n=1 的时候成立
于是我们假设 n=a-1的时候成立,
然后只要证明 n=a的时候,仍然成立即可。
实际上递归就是一个数学归纳法的过程,
我们在写代码的时候,总是先假设n-1的符合我们设想,然后写出式子,让式子在n的这一步仍然成立。
最后那个n=1的条件,就是类似于我们使用数学归纳法的n=1的第一个步骤,
毕竟递归问题实际上,也是归纳其模式,不是吗?
//a柱子上有ai个 b柱子上有bi个 c柱子上有ci个
void move(int num, char a, char b, char c,int &i,int &ai,int &bi,int &ci) {
printf("%d %c到%c\n", num, a, c);
printf("%d次\n", ++i);
printf("%d %d %d\n\n", --ai, bi,++ci);
}
void hanoi(int num, char a, char b, char c,int& i,int &ai,int &bi,int &ci) {
if (num == 0) return ;
hanoi(num - 1, a, c, b,i,ai,ci,bi); //a经过c到了b
move(num, a, b, c,i,ai,bi,ci);
hanoi(num - 1, b, a, c,i,bi,ai,ci);//b经过a到了c
//思考汉诺塔问题 应该自下至顶 假定上面的n-1已经运行过了 考虑模式问题
}
void main() {
int i = 0;
int ai = 6;//假定ai柱子上最开始有6个
int bi = 0, ci = 0;
hanoi(ai, 'a', 'b', 'c',i,ai,bi,ci);
return ; //对void来说 直接是return 不要加东西
}