cpp:汉诺塔问题cpp实现,显示每一步柱子上有几个盘子

我在汉诺塔问题递归的思想是什么?
想通了。
还记得我们高中时候如何使用数学归纳法吗?
我们先证明 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 不要加东西
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值