求Linux下汉诺塔程序详细解释~~

作者&投稿:父万 (若有异议请与网页底部的电邮联系)
用shell编写一个汉诺塔游戏的程序,求代码。~

#!/bin/bash E_NOPARAM=10 # 错误码1:没有参数传给脚本 E_BADPARAM=20 # 错误码2:传给脚本的盘子数不合法 Moves=0 # 保存移动次数的全局变量.dohanoi() { # 递归函数 case $1 in 0) ;; *) dohanoi "$(($1-1))" $2 $4 $3 echo move $2 "-->" $3 let "Moves += 1" # 这儿修改了原脚本. dohanoi "$(($1-1))" $4 $3 $2 ;; esac}case $# in1) case $(($1>0)) in # 至少要有一个盘子. 1) dohanoi $1 1 3 2 echo "Total moves = $Moves" exit 0; ;; *) echo "$0: illegal value for number of disks"; exit $E_BADPARAM; ;; esac ;;*) echo "usage: $0 N" echo " Where \"N\" is the number of disks." exit $E_NOPARAM; ;;esac根据《高级Bash Shell脚本编程指南.pdf》上的示例改写。

整体分析法会不。
1.假如我已经将n-1从a移到b了,用个函数g表示这个过程(现在你不用管它是如何完成的,反正它会完成的,就好比中南海会制定出合理的政策来,普通百姓不用管这个过程,把中南海看成一个整体),你会第2步了吧
2.移动1个到c
3.假如我又已经将n-1从b移到c了,用个函数t表示这个过程。
所以hanoi(n,a,b,c){
g(n-1,a,c,b);
move(a,c);
t(n-1,b,a,c);
}
现在看g()是如何完成的,
1.假如我已经将n-2从a移到c了
2.将1个从a移动b
3.假如我又将n-2个从c移到b
这三步恰恰是hanoi函数n-1时盘子移动的情况,所以g=hanoi
同理推得t=hanoi

不要把简单问题复杂化,汉诺塔其实很简单,通过它你关键在理解递归原理就行,何必纠结于这些让人费解的上面的垃圾代码!
汉诺塔程序如下:
#include <iostream>
#include <string>
using namespace std;
int sum=0;
/*
* 为了移动A上面的圆盘到C上面,仅能借助B:
* 首先由A将n-1个较小的圆盘移至B,
* 然后将A上剩下的上最大的圆盘移至C,
* 最后再将B上n-1个较小的圆盘移至C
*/
void Hanoi(int n,string A,string B,string C)
{
if(n==1)
cout<<"move "<<A<<" to "<<C<<endl;
else
{
Hanoi(n-1,A,C,B);
cout<<"move "<<A<<" to "<<C<<endl;
Hanoi(n-1,B,A,C);
}
++sum;
}
int main()
{
Hanoi(3,"A","B","C");
cout<<"The sum step is "<<sum<<endl;
return 0;
}


求Linux下汉诺塔程序详细解释~~
汉诺塔程序如下:include <iostream> include <string> using namespace std;int sum=0;\/ 为了移动A上面的圆盘到C上面,仅能借助B:首先由A将n-1个较小的圆盘移至B,然后将A上剩下的上最大的圆盘移至C,最后再将B上n-1个较小的圆盘移至C \/ void Hanoi(int n,string A,string B,string C...

汉诺塔汇编程序设计报告
下面是我在我的计算机上虚拟的Linux环境下用3种不同的方法解决规模为1-30的汉诺塔问题所花的时间的比较结果(单位是秒),你也可以把这个程序下载到你的计算机上去测试一下。Scale Stack Recursion Other (1-30)1 0 0 02 0 0 03 0 0 04 0 0 05 0 0 06 0 0 07 0 0 08 0 0 09 0 0 010 ...

怎么用递归的方法做汉诺塔c程序?
include <stdio.h> \/\/递归汉诺塔程序 \/\/参数定义:n为移动的盘子数,from指开始所在盘,tmp为中间盘,to为目标盘 void haoii(int n,int from,int tmp,int to){ if (n==0) return;\/\/将n-1个盘子以目标盘为中介,从开始盘递到中间盘 haoii(n-1,from,to,tmp);将最后一个盘子移到目标...

如何做一个C语言编程的汉诺塔游戏?要有源代码。
(3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出递归和非递归的不同实现源代码。 本回答由提问者推荐 举报| 答案纠错...

Python培训大纲哪有
我们的Python培训大纲包括Python基础语法、函数式编程、面向对象编程、网络编程、数据库操作等内容,涵盖了Python在互联网开发中的常用技术和工具。通过理论学习和实战项目实践相结合的方式,学员可以深入了解并掌握Python在互联网领域的应用。其次,对于Java开发和就业方向,千锋教育有着丰富的经验和优质的师资...

c语言设计
void move(char x,char y){ printf("%c-->%c\\n",x,y);} void hanoi(int n,char one ,char two,char three){ if(n==1) move(one,three);else { hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);} } main(){ int m;printf("input the number of ...

运维工程师笔试题
汉诺塔(Hanoi)问题中令h(n)为从A移动n个金片到C上所用的次数,则递归方程为 1. h(n)=2hn-1 2. h(n) = 2h(n-1) 1 3. h(n)=2^n-n*h-1 4. h(n)=2h*n-1 Question 29. (单选) 启发式搜索一般是何种算法的改进 1. 深度优先搜索 2. 广度优先搜索 3. 动态规划 4. 贪婪法 Question ...

[编程]给点灵感……
第一,操作很烦琐,条条框框多的可怕,我希望能够直接选择公式,自定义取值范围,自定义坐标系,公式可以直接输入参数,不要再让我打字母...第二,线线细的可怕,如果在我们班用幻灯的话,根本看不见,希望能大一点,线粗点,最好是自己能调的.第三,难免有多个图象一起出现的,能加上颜色最好.第四,程序不...

我学C的,现在怎么办啊?
我以上说的是纯c语言。在嵌入式里,虽然是以纯c为主的,但是c++在作界面的时候也还会用到一些的。总之,现在是没有纯c的了,都是混用的。c语言的指针固然重要,是c的灵魂,但是,在以后的工作中,用的最多的还是文件读写,和字符串操作。你想阿,如果不用文件读写的话,你编的程序是很难完成...

IT中哪个语言入门最快?
当然c++后续c#也是要学习的。2.下面我给你最重要的建议,学编程必须要会的东西,否则只是到头来只是一场空,那就是操作系统的知识,建议你看linux源代码,或者任何一种操作系统的知识。不是要你学表面的东西,你说windows没有源代码怎么办?没关系,你可以学习他的操作系统的很多关键机制,和编程有...

潜山县18843104927: 汉诺塔问题,为什么程序这样写,请解释一下 -
虿宽郁金: 当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上.当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上.当A塔上有3个盘子时...

潜山县18843104927: 汉诺塔C 程序的解释个个程序 都是什么意思啊? -
虿宽郁金: 你是不是想问“解释这个汉诺塔C程序”啊?人家都看不懂,难怪没人答我简单讲一下吧 main() { clrscr();//清屏 init();//初始化 getche(); //接受一个按键,等待开始 hanoi(10,a,b,c); //主要的汉诺塔运算 getche(); //按键,离开 }这个程序最重要的是move()和hanoi(),并且运用了递归

潜山县18843104927: 求C汉诺塔递归过程详解 -
虿宽郁金: 解决汉诺塔的基本思想是先把n个盘子除了最下面的盘子以外的所有盘子从第一根柱子(初始柱子)移动到中间那个柱子上(辅助柱子),然后把最下面的盘子移动到最后一根柱子上(目标柱子).最后把剩下的盘子移动到目标柱子上.这样,...

潜山县18843104927: 求汉诺塔C递归算法详细解答 -
虿宽郁金: Hanoi塔问题, 算法分析如下,设A上有n个盘子.如果n=1,则将圆盘从A直接移动到C.如果n=2,则:(1)将A上的n-1(等于1)个圆盘移到B上;(2)再将A上的一个圆盘移到C上;(3)最后将B上的n-1(等于1)个圆盘移到C上.如果n=...

潜山县18843104927: 用Linux shell脚本编程实现汉诺塔的递归算法 -
虿宽郁金: #!/bin/bash E_NOPARAM=66 E_BADPARAM=67 Moves=0 dohanoi(){ case $1 in 0) ;; *) dohanoi "$(($1-1))" $2 $4 $3 echo move $2 "-->" $3 let "Moves += 1" dohanoi "$(($1-1))" $4 $3 $2 ;; esac } case $# in1) case $(($1>0)) in 1) ...

潜山县18843104927: 谁帮我解释一下河内塔程序? -
虿宽郁金: 汉诺塔问题是程序设计中的经典递归问题. 算法思路: 1.如果只有一个金片,则把该金片从源移动到目标棒,结束. 2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒 补充:汉...

潜山县18843104927: 谁有关于汉诺塔算法的非常详细的解释?
虿宽郁金: =,递归法由于1 个的时候是1次,结果n个的时候为(2的n次方减1)次.1个圆盘的时候 2的1次方减12个圆盘的时候 2的2次方减13个圆盘的时候 2的3次方减14个圆盘的时候 2的4次方减15个圆盘的时候 2的5次方减1........n个圆盘的时候 2的n次方减1也就是说,n=64的时候是(2的64次方减1)次.

潜山县18843104927: 计算机数据结构的一道题: 汉诺塔问题:前提是只有3个金盘,麻烦给详细解释一下这段代码: -
虿宽郁金: 我和你一样,对汉诺塔一直搞不懂,但是有天上课,狠下心,安静的想想,然后自己代入数字去算,终于搞懂了...那就按3个金盘分析吧.在one塔上,有三个盘,假设它是从大到小排列的(最下面的盘最大),并把盘移至three塔上,...

潜山县18843104927: 汉诺塔求解释``` -
虿宽郁金: 子程序 汉诺塔盘子运动 .参数 盘子数,整数型 .参数 柱子甲,文本型 .参数 柱子乙,文本型 .参数 柱子丙,文本型 .如果 (盘子数 = 1) ' 如果只有一个盘,则直接将它从柱子一移动到柱子三 移动 (1,柱子甲,柱子丙) .否则 ' 把1 ~ n - 1个盘从柱...

潜山县18843104927: 求汉诺塔问题的详解 ...
虿宽郁金: 呵呵.这是个很有趣的程序.汉诺塔有3个柱,最多3个盘.最底层那个总为1.第二层就是n-1.当n为1时,代表只有一个盘,直接移到3柱.当超过一个盘时,执行hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); 这个hanoi()里面的one,two,three是个形式参数,所以你只要老是看hanoi(n,a,b,c)就行了.至于形参换位置,就是abc换位置,于是上面的指令就是第二层盘子从1柱移到2柱,后面的就是3层的盘子移到3柱,函数重调用,,,最后显示,则是从那个if(n==1)哪里开始,因为这是函数冲调用 的规则,...这题的思维是反过来的,.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网