问题起源:
- 汉诺塔于十九世纪八十年代法国数学家发明 广泛用于神庙
- 汉诺塔在递归界的地位和 hello world 在程序设计中的地位
1、问题刻画
1.问题的刻画 递归需要满足:所有的子问题都适用最初始的形式
- 递归过程需要接受 —在不改变问题形式的情况下缩小问题的规模
- 1、要移动的圆盘的数量。
- 2、圆盘开始时候所在塔尖的名字
- 3、圆盘在结束时所在塔尖的位置
- 4、用作临时存放地塔尖的名字
#include <stdio.h>
extern void moveTower(int n, char A, char B, char C);
void main()
{
}
//意思是将A上的n个圆盘移动到B--同时C作为临时的存放地
void moveTower(int n, char A, char B, char C)
{
}
2.需要递归策略
- 1.必须需要一个简单的情况 --- n = 1;不违反(不将大盘放在小盘子之上就行)
- 2.必须有一个递归的化解方案 ---将问题化解为原来问题相同的形式更加简单的问题(最核心)
- 3.自己找例子或者画图 看 如何缩小问题规模
本题具体思路
- 本题:需要考虑 移动8个时 当移动7个是或不是对解题有利。
- 转化为规模更小的情况下
- 0、将8个从A移动到B
- 1、7 个从 A移动到C
- 2、底部从A到B
- 3、将移走的7个从C移动到B(此时之前的C变成了A又成为了临时塔尖)—问题规模缩小
本题思路归纳:
- 问题由简单的例子 数学归纳:
- 1、将上面的N-1个起始从塔尖移动到临时塔尖
- 2、将底部的圆盘从起始塔尖移动到目标塔尖
- 3、将移动走的N-1个圆盘从临时塔尖移动回目标塔尖---
- ---这步骤是自己没有总结到的怎么处理---怎么将起始塔尖转变成为临时塔尖
递归部分的伪代码:
- void movdTower(int n,char start,char finish,char tmp){
- if(n==1){
- 移动一个元素从start到finish
- }else{
- 移动尺寸为n-1的圆盘从start 到 tmp;
- 移动一个圆盘从 start 到 finish;
- 移动尺寸为n-1的圆盘从tmp到finish;
- }
3、验证递归的策略
4、编码解决问题
/*Hanoi tower*/
//汉诺塔
#include <stdio.h>
#