递归算法学习———汉诺塔
来源:互联网 发布:caxa机械制图软件 编辑:程序博客网 时间:2024/06/05 04:23
由来:
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。
假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,f(64)= 2^64-1=18446744073709551615
算法分析:
我们可以先分析盘子比较少的情况。假定盘子从大向小依次为:盘子1,盘子2,...,盘子64。
如果n=1,则将圆盘从A直接移动到C。
如果n=2,则:
(1)将A上的n-1(等于1)个圆盘移到B上(借助于C);
(2)再将A上的一个圆盘移到C上;
(3)最后将B上的n-1(等于1)个圆盘移到C上。
如果n=3,则:
A)将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下:
(1)将A上的n`-1(等于1)个圆盘移到C上。
(2)将A上的一个圆盘移到B。
(3)将C上的n`-1(等于1)个圆盘移到B。
B)将A上的一个圆盘移到C。
C)将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下:
(1)将B上的n`-1(等于1)个圆盘移到A。
(2)将B上的一个盘子移到C。
(3)将A上的n`-1(等于1)个圆盘移到C。到此,完成了三个圆盘的移动过程。
从上面分析可以看出,当n大于等于2时, 移动的过程可分解为三个步骤:
第一步 把A上的n-1个圆盘通过辅助C移到B上;
hanoi(n-1,A,C,B)
第二步 把A上的一个圆盘移到C上;
printf("Move disk %d from %c to %c\n",n,A,C)
第三步 把B上的n-1个圆盘通过辅助A移到C上;
hanoi(n-1,B,A,C)实现如下:
#include<stdio.h>void hanoi(int n,char A,char B,char C){if(n==1){ printf("Move disk %d from %c to %c\n",n,A,C);}else{ hanoi(n-1,A,C,B); printf("Move disk %d from %c to %c\n",n,A,C); hanoi(n-1,B,A,C);}}main(){int n;printf("请输入数字n以解决n阶汉诺塔问题:\n");scanf("%d",&n);hanoi(n,'A','B','C');}
- 递归算法学习———汉诺塔
- 算法学习——递归实践
- Snail—算法学习之初始递归
- 递归算法—输入字母逆序输出&汉诺塔递归算法
- 【数据结构】递归算法—汉诺塔
- 算法——递归
- 算法——递归
- 算法——递归
- 算法——递归算法
- 常用算法—递归
- 递归算法学习之蛙跳问题——01
- U3D开发学习之路——递归算法
- 经典算法学习——非递归遍历二叉树
- 一些简单算法的学习——递归
- 递归算法——汉诺塔问题
- 算法笔记——【递归】汉诺塔问题
- 递归算法——汉诺塔问题
- 递归算法——入门汉诺塔
- USB摄像头采集图像(DirectShow)
- Winrar4.11免费破解版(破解方法/激活码)
- Centos环境下MySQL-python安装过程
- 正则表达式的构造摘要
- Android学习笔记3--“Android SDK Content loader has encountered a problem” “parseSdkContent Failed ”
- 递归算法学习———汉诺塔
- BPMN2新规范与Activiti5 (Activiti5的特性介绍)
- BigDecimal类
- 关于论坛建设问题
- GridControl详解(四)分组排序汇总
- 安装完mysql-python后import加载模块 ImportError: libmysqlclient_r.so.16
- PHP UTF-8和Unicode编号互转
- 批处理作业调度
- BigDecimal用法