9.2.7汉诺塔问题-思路及C语言代码实现(参考埃里克java程序设计-算法策略 && 孟庆昌C语言)

本文介绍了汉诺塔问题的起源及其在递归算法中的重要性。通过问题刻画,提出解决汉诺塔问题的递归策略,包括一个简单情况(n=1)和递归化解方案。详细阐述了将圆盘从A移动到B的思路,通过将问题规模不断缩小,最终转化为移动N-1个圆盘的子问题。提供了递归部分的伪代码,为实现该问题的解决方案打下基础。
摘要由CSDN通过智能技术生成

问题起源:

  • 汉诺塔于十九世纪八十年代法国数学家发明 广泛用于神庙
  • 汉诺塔在递归界的地位和 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>
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值