C语言入门递归算法——汉诺塔(简单易懂,最后还有汉诺塔游戏)
什么是汉诺塔:
汉诺塔:(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
怎么用实现汉诺塔:
1: 先给三个柱子A,B,C 2: 三个需要移动的方块 1 , 2 , 3
每次移动的时候要保证大盘子在小盘子的下面
假如只有一个盘子
那么只需要把A柱的1号,移动到C柱
盘子数量 次数 步骤
1 1 A---C
假如有两个盘子:
1: 把在A柱的2号移动到B柱 2:再把A柱的1号移动到C柱 3: 最后把B柱的2号移动在C柱
盘子数量 次数 步骤
2 3 A---B , A---C ,B---C
假如有三个盘子要怎么实现
1:把A柱的3号移动到C柱 A---C
2:把A柱的2号移动到B柱 A---B
3:把C柱的3号移动到B柱 C---B
4:把A柱的1号移动到C柱 A---C
5:把B柱的3号移动到A柱 B---A
6:把B柱的2号移动到C柱 B---C
7:把A柱的3号移动到C柱 A--C
盘子数量 次数 步骤
3 7 A---C , A---B , C---B , A---C , B---A , B---C , A---C
总结:假设有n个盘子,那就需要移动 2^n-1 次
怎么用C语言实现汉诺塔的移动
1:先写一个主函数
int main()
{return 0;
}
2:写一个函数来模拟这个过程
void move(char POS1, char POS2)
{printf(" %C---%C ", POS1, POS2);
}
3:写一下汉诺塔
前言:假如有n个盘子,把n-1个盘子通过C柱移动到B柱
// n 代表盘子的个数
// POS1 代表 A 起始位置
// POS2 代表 B 中转位置
// POS3 代表 C 目的位置
void Hanoi(int n, char POS1, char POS2, char POS3)
{}
3.1:递归需要一个终止条件,这个if语句的意思是 如果有1个盘子,那么从POS1 移动到 POS3
void Hanoi(int n, char POS1, char POS2, char POS3)
{// 1:递归需要一个终止条件if (n == 1){move(POS1, POS3);// 如果有1个盘子,那么从POS1 移动到 POS3}}
3.2: n-1个盘子在POS1 通过POS3 移动到 POS2
void Hanoi(int n, char POS1, char POS2, char POS3)
{if (n == 1){move(POS1, POS3);}else{Hanoi(n - 1, POS1, POS3, POS2);// n-1个盘子在POS1 通过POS3 移动到 POS2}
}
3.3: 如果把n-1个盘子已经移动到POS2 ,那么就把POS1的一个移动到POS3
void Hanoi(int n, char POS1, char POS2, char POS3)
{if (n == 1){move(POS1, POS3);}else{Hanoi(n - 1, POS1, POS3, POS2);move(POS1, POS3);// 如果把n-1个盘子已经移动到POS2 ,那么就把POS1的一个移动到POS3}
}
3.4: 此时POS2 还有n-1个盘子
把POS2的起始位置 通过POS1的中转位置 移动到POS3目的位置
void Hanoi(int n, char POS1, char POS2, char POS3)
{if (n == 1){move(POS1, POS3);}else{Hanoi(n - 1, POS1, POS3, POS2);move(POS1, POS3);Hanoi(n - 1, POS2, POS1, POS3);// 此时POS2 还有n-1个盘子// 此时的POS2就相当于起始位置// 把POS2的起始位置 通过POS1的中转位置 移动到POS3目的位置}
}
最后:肯定是打印代码看看
int main()
{Hanoi(1, 'A', 'B', 'C');printf("\n");Hanoi(2, 'A', 'B', 'C');printf("\n");Hanoi(3, 'A', 'B', 'C');return 0;
}
和前面用画图解释的一模一样
总代码加注释版本,不懂一定要多调试
#include<stdio.h>void move(char POS1, char POS2)
{printf(" %C---%C ", POS1, POS2);
}// n 代表盘子的个数
// POS1 代表 A 起始位置
// POS2 代表 B 中转位置
// POS3 代表 C 目的位置
void Hanoi(int n, char POS1, char POS2, char POS3)
{// 1:递归需要一个终止条件if (n == 1){move(POS1, POS3);}// 如果有1个盘子,那么从POS1 移动到 POS3else{Hanoi(n - 1, POS1, POS3, POS2);// n-1个盘子在POS1 通过POS3 移动到 POS2move(POS1, POS3);// 如果把n-1个已经移动到POS2 ,那么就把POS1的一个移动到POS3Hanoi(n - 1, POS2, POS1, POS3);// 此时POS2 还有n-1个盘子// 此时的POS2就相当于起始位置// 把POS2的起始位置 通过POS1的中转位置 移动到POS3目的位置}
}int main()
{Hanoi(1, 'A', 'B', 'C');printf("\n");Hanoi(2, 'A', 'B', 'C');printf("\n");Hanoi(3, 'A', 'B', 'C');return 0;
}
汉诺塔的游戏大家可以玩一下
汉诺塔小游戏
C语言入门递归算法——汉诺塔(简单易懂,最后还有汉诺塔游戏)相关推荐
- C语言中怎么用循环统计买法,C语言入门谭浩强版简单选择法冒泡法用数组和for循环进行学生成绩简单统计处理...
C语言入门谭浩强版 简单选择法排序 冒泡法排序 用数组和for循环进行学生成绩简单统计处理 例如:求个人平均分 学科平均分 单科最高分等 简单选择法 #include #define N 10 voi ...
- C语言入门——递归(思想简要讲解+简单递归练习)
C语言入门--递归(简要讲解+递归练习) 递归定义: 程序调用自身的编程技巧称为递归( recursion). 递归从字面上我们可以理解为: 递去+归来 如下图 使用递归的目的: 简要:简化代码量,方 ...
- C语言:简易商品库存管理系统(简单易懂,不用指针的入门级示例,数据结构大作业)
C语言:商品库存管理系统(简单易懂,不用指针的入门级示例) 没有使用指针,没有写入文件,全部是最基础的c语言语句,本程序使用vc6.0测试 功能: 1.创建商品的信息 2.显示全部商品对信息(商品数量 ...
- “三色河内塔”算法(三色汉诺塔)
问题引入 "三色河内塔"由"河内之塔"的规则衍生而来(点击查看),区别在于三色河内塔的目的是将图1所示的圆盘位置,移动成为图2所示的圆盘位置."三色河 ...
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)...
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
- [万人千题] 《C语言入门100例》(第19例) 日期——题2(C语言)(超简单)
零.欸嘿! 英雄哪里出来<C语言入门100例>传送门 https://bbs.csdn.net/forums/hero?category=0&typeId=17913https:/ ...
- [万人千题] 《C语言入门100例》(第19例) 日期——题1(C语言)(超简单)
零.欸嘿! 英雄哪里出来<C语言入门100例>传送门 https://bbs.csdn.net/forums/hero?category=0&typeId=17913https:/ ...
- c语言简单的while语句,C语言入门 — while语句
C语言入门,while语句,实现在一定条件下的循环,可以用while实现死循环,while的使用语法如下: while(执行条件) { 执行代码: } 1.使用while,实现死循环,死循环一般在新建 ...
- C语言入门part6--函数
C语言入门part6–函数 关键字:库函数,自定义函数,函数的嵌套调用及链式访问,递归,strlen 和sizeof的区别,* p++和(*p)++的区别 C语言入门part1 C语言入门part2 ...
最新文章
- [二叉树建树] 后序遍历与中序遍历建立二叉树
- hadoop 部分问题
- ASP.NET Core官方文档+源码,这样学效率高10倍!
- matlab 按钮组设置,MATLAB中的单选按钮和按钮组
- 自然语言处理——句子的相似度
- 中国高铁走向全球,一个行业标准帮了大忙
- JS 简易控制台插件 [供 博客, 论坛 运行js用]
- 遭遇爆炸式匿名*** 瑞星称有人下黑手
- 2021CCF推荐国际学术会议A类及相关领域介绍
- 练字一定要用钢笔吗?
- 【Datawhale IntelVINO学习笔记】OpenVINO音频和人体姿态识别
- 工商银行支付接口开发Java
- 计算机主机清理步骤,教你4个C盘清理方法,去掉电脑90%垃圾文件
- 进阶必学之微服务架构下分布式事务解决方案,你不知道的58同城
- 群晖同步数据到天翼网盘
- QQ农场外挂开发实践
- webrtc码率设置的函数调用
- MyBatis 报错 Could not initialize class
- 在Mac上如何查看自己是否安装过jdk以及对应版本?
- Build Library By xcodebuild