- S笔记
-
一开始我接触汉诺塔也是很不解,随着代码量的积累,现在很容易就看懂了,因此楼主主要还是对递归函数的理解不够深刻,建议你多写一些递归程序,熟练了自己就能理解。
圆盘逻辑移动过程+程序递归过程分析
hanoi塔问题, 算法分析如下,设a上有n个盘子,为了便于理解我将n个盘子从上到下编号1-n,标记为盘子1,盘子2......盘子n。
如果n=1,则将“ 圆盘1 ” 从 a 直接移动到 c。
如果n=2,则:
(1)将a上的n-1(等于1)个圆盘移到b上,也就是把盘1移动到b上;
(2)再将a上 “盘2” 移到c上;
(3)最后将b上的n-1(等于1)个圆盘移到c上,也就是第(1)步中放在b上的盘1移动到c上。
注意:在这里由于超过了1个盘子,因此不能直接把盘子从a移动到c上,要借助b,那
么 hanoi(n,one,two,three)的含义就是由n个盘子,从one移动到three,如果n>2
那么就进行递归,如果n=1,那么就直接移动。
具体流程:
hanoi(2,a,b,c);由于2>1因此进入了递归的环节中。
<1>执行hanoi(1,a,c,b):这里就是刚才的步骤(1),代表借助c柱子,将a柱子上的 1个圆盘(盘1)移动到b柱子,其实由于是n=1,此时c柱子并没被用到,而是直接移动了。
<2>执行hanoi(1,a,b,c):这是步骤(2),借助b柱子,将a柱子上的一个圆盘(盘2)移动到c柱子上。这里由于也是n=1,也并没有真正借助b柱子,直接移动的。
<3>执行hanoi(1,b,a,c):这是步骤(3),将b上的一个盘子(盘1)移动到c
函数中由于每次调用hanoi的n值都是1,那么都不会进入递归中,都是直接执行了mov移动函数。
如果n=3,则:(倒着想会想明白)移动的倒数第二部,必然是下面的情况
(1)将a上的n`-1(等于2)个圆盘移到c上,也就是将盘1、盘2 此时都在b柱子上,只有这样才能移动最下面的盘子(盘3)。那么由于现在我们先忽略的最大的盘子(盘3),那么我们现在的目标就是,将两个盘子(盘1、盘2)从a柱子上,借助c柱 子,移动到b柱子上来,这个过程是上面n=2的时候的移动过程,n=2的移动过程是“2 个盘子,从柱子a,借助柱子b,移动到柱子c”。现在是“2个盘子,从柱子a,借助柱子 c,移动到柱子b上”。因此移动过程直接调用n=2的移动过程就能实现。
(2)将a上的一个圆盘(盘3)移到c。
(3)到这一步,由于已经将最大的盘子(盘3)移动到了目的地,此时无论后面怎么移动都不需要在用到最大的那个盘子(盘3),我们就先忽略他,剩下的目标就是将b上面的n-1个盘子(盘1、盘2)移动到c上,由于a上没有盘子了,此时要完成上面的目标,就要借助a盘子。最终达到的目标就是将b上的2个盘子,借助a移动到c上,这个过程就是当n=2时分析的过程了,仅仅是最开始的柱子(b柱子)和被借助的柱子(a柱子)不同了。所以直接调用n=2时候的过程就能股实现了。
具体执行过程:
hanoi(3,a,b,c);由于3>1因此进入了递归的环节中。
<1>执行hanoi(2,a,c,b):这里代表刚才的步骤(1),将两个盘子(盘1、盘2)从a移动到b,中间借助c。根据n=2的分析过程,必然是能够达到我们的目的。
<2>执行hanoi(1,a,b,c):现在a上只有一个盘子(盘3),直接移动到c上面即可。
<3>执行hanoi(2,b,a,c):此时对应步骤(3),剩下的目标就是将b上的两个盘子,借助a移动到c上。那么同样根据n=2的移动过程,必然能达到目的。
最终实现了3个盘子从a,借助b移动到了c。
- max笔记
-
第一,把a上的n-1个盘通过c移动到b。第二,把a上的最下面的盘移到c。第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。
- 大鱼炖火锅
-
主要原因是 楼主对递归执行的原理搞不明白,网上许多人也是如此。
把递归的执行原理要体会。再看汉塔问题就能一下子明白了。
这个汉塔是很简单的算法,没有比这个更简单的算法了。
递归算法的好处是实现简单,但需要大量的堆栈空间,一旦理解了递归
就觉得递归非常方便。如果不理解递归,就觉得太深奥。
多下点功夫!学东西要学到本质,会点皮毛是不行的。
hanoi是越南哪个城市
hanoi是越南的河内市。河内市,位于越南北部,红河三角洲西北部,是越南的首都,也是越南的工业、文化中心。hanoi(河内市)历史上就是越南的古都,市区历史文物丰富,名胜古迹遍布。河内市,人口约为800万,多为京族。越南主要以越南语为主,少数旅游地区说汉语和英语。河内市季节分明但四季气候偏热,地处副热带季风气候地带,春季,温润多细雨;夏季高温多雨;夏秋季时有台风、洪涝;冬季盛行较温凉的东北季风,气温常在14℃至18℃之间。河内市好玩的景点还剑湖。红河支流形成的淡水湖,位于河内市中心,位于以其命名的还剑郡,为河内著名地标兼旅游景点。据传越南后黎朝开国皇帝黎利曾在此湖得到一把古剑,后又将古剑归还给湖中的神龟,湖名自此被改为还剑湖。胡志明纪念堂。位于市中心的巴亭广场,为了纪念前领导人胡志明,其国内的地位相当于我们国家的主席纪念馆和天安门广场。升龙皇城。位于越南河内市的皇城,又被称为“越南故宫”,是越南历史各朝代的古宫殿建筑群。以上内容参考百度百科-越南河内市2023-06-28 22:19:561
我想问问hanoi是越南哪个城市
首都。第二大城市。河内(Hanoi)作为越南首都和第二大城市,融合了1000多年的历史和现代化的发展。河内丰富的历史文物,遍布的名胜古迹,使它获得了“千年文物之地”的美称。河内是最能代表越南社会主义风格的地方。大街小巷的革命口号涂鸦,满街穿着奥黛的美丽姑娘,摩托车从身边呼啸而过,窄窄的独栋小屋上画着五彩缤纷的图案,都能明确地告诉你,你在越南。河内位于越南北部,1-3月天气凉爽,降雨少;4-9月进入雨季,温度不断升高,时有台风,应随身携带雨伞;10-12月气温回落,天气凉爽舒适,此期间是欧美游客前往河内旅游的旺季,住宿价格上涨。盾,是越南的货币单位。一些海外越南人,如美籍越南人称“盾”为“VND”,即“越南盾”的意思。目前,游客常见的有1万、2万、5万、10万、20万及50万等五种面额的纸币。兑换:1人民币≈3408.16越南盾,1美元≈21264越南盾,10000越南盾≈2.94人民币,10000越南盾≈0.47美元。更多关于hanoi是越南哪个城市,进入:https://www.abcgonglue.com/ask/97c4c61655789423.html查看更多内容2023-06-28 22:20:141
越南的河内用英语怎么说
ce to face. No2023-06-28 22:20:232
hanoi是越南哪个城市
hanoi是越南的河内市。河内是越南的政治经济文化中心,市区的巴亭广场是举行大型集会和重大政治活动的场所,亦是当年越南宣布越南民主共和国成立的地方,广场四周有主席府、巴亭会堂及党政军机关。河内地处红河三角洲西北部,红河与墩河汇流处,四周分别与河北省、北太省、永富省、河西省接壤。红河从市区旁边缓缓流过,最宽处达2000米左右。章阳桥、龙编桥、升龙桥从东、北两个方向把市区和郊区连接起来。2023-06-28 22:20:321
河内用英语怎么说
问题一:越南的河内用英语怎么说 Hanoi in Vietnam 问题二:越南和河内的英文分别是什么? 河内 [ hé nèi ] . . Hanoi 越南 . 郸 Vietnam 问题三:越南胡志明,河内等大城市的英文怎么说 河内 Hanoi 胡志明市 Thanh Pho Ho Chi Minh / Ho Chi Minh City 海防 Hai Phong / Haiphong 越南地名中英文对照表 安江 An Giang 龙川 Long Xuyen 巴地-头顿 Ba Ria-Vung Tau 头顿 Vung Tau 北太 Bac Thai 太原 Thai Nguyen 槟知 Ben Tre 槟知 Ben Tre 平定 Binh Dinh 归仁 Quy Nhon 平顺 Binh Thuan 藩切 Phan Thiet 芹苴 Cao Tho 芹苴 Can Tho 高平 Cao Bang 高平 Cao Bang 多乐 Dac lac 邦美蜀 Buon Me Thuot 同奈 Dong Nai 边和 Bien Hoa 同塔 Dong Thap 高岭 Cao Lamh 嘉莱 Gia Lai 波来古 Play Ku 河北 Ha Bac 北江 Bac Giang 河江 Ha Giang 河江 Hai Duang 海兴 Hai Hung 海阳 Hai Duang 河西 Ha Tay 河东 Ha Dong 河静 Ha Tinh 河静 Ha Tinh 和平 Hoa Binh 和平 Hoa Binh 庆和 Khanh Hoa 芽庄 Nha Trang 昆嵩 Kon Tum 昆嵩 Kon Tum 建江 Kien Giang 迪石 Rach Gia 莱州 Lai Chau 莱州 Lai Chua 林同 Lam Dong 大叻 Da Lat 谅山 Lang Son 谅山 Lang Son 老街 Lao Cai 老街 Lao Cai 隆安 Long An 新安 Tan An 明海 Minh Hai 金瓯 Ca Mau 南河 Nam Ha 南定 Nam Dinh 义安 Nghe An 荣市 Vinh 宁平 Ninh Binh 宁平 Ninh Binh 宁顺 Ninh Thuan 藩朗-塔占 Phan Rang-Thap Cham 富安 Phu Yen 绥和 Tuy Hoa 广平 Quang Binh 洞海 Dong Hoi 广南-岘港 Quang Nam-Da Nang 岘港 Da Nang 广义 Quang Ngai 广义 Quang Ngai 广宁 Quang Ninh 鸿基 Hon Gai 广治 Quang Tri 东河 Dong Ha 朔庄 Soc Trang 朔庄 Soc Trang 小河 Song Be 土龙木 Thu Dau Mot 山萝 Son La 山萝 Son La 西宁 Tay Ninh 西宁 Tay Ninh 太平 Thai Binh 太平 Thai Binh 清化 Thanh Hoa 清化 Thanh Hoa 承天-顺化 Thua Thien-Hue 顺化 Hue 前江 Tien Giang 美 My Tho 宣光 Tuyen Quang 宣光 Tuyen Quang 茶荣 Tra Vinh 茶荣 Tra Vinh 永隆 Vinh Long 永隆 Vinh Long 永富 Vinh Phu 越池 Viet Tri 安沛 Yen Bai 安沛 Yen Ba......>> 问题四:越南胡志明,河内等大城市的英文怎么说? 河内 Hanoi 胡志明市 Thanh Pho Ho Chi Minh / Ho Chi Minh City 海防 Hai Phong / Haiphong 越南地名中英文对照表 安江 An Giang 龙川 Long Xuyen 巴地-头顿 Ba Ria-Vung Tau 头顿 Vung Tau 北太 Bac Thai 太原 Thai Nguyen 槟知 Ben Tre 槟知 Ben Tre 平定 Binh Dinh 归仁 Quy Nhon 平顺 Binh Thuan 藩切 Phan Thiet 芹苴 Cao Tho 芹苴 Can Tho 高平 Cao Bang 高平 Cao Bang 多乐 Dac lac 邦美蜀 Buon M哗 Thuot 同奈 Dong Nai 边和 Bien Hoa 同塔 Dong Thap 高岭 Cao Lamh 嘉莱 Gia Lai 波来古 Play Ku 河北 Ha Bac 北江 Bac Giang 河江 Ha Giang 河江 Hai Duang 海兴 Hai Hung 海阳 Hai Duang 河西 Ha Tay 河东 Ha Dong 河静 Ha Tinh 河静 Ha Tinh 和平 Hoa Binh 和平 Hoa Binh 庆和 Khanh Hoa 芽庄 Nha Trang 昆嵩 Kon Tum 昆嵩 Kon Tum 建江 Kien Giang 迪石 Rach Gia 莱州 Lai Chau 莱州 Lai Chua 林同 Lam Dong 大叻 Da Lat 谅山 Lang Son 谅山 Lang Son 老街 Lao Cai 老街 Lao Cai 隆安 Long An 新安 Tan An 明海 Minh Hai 金瓯 Ca Mau 南河 Nam Ha 南定 Nam Dinh 义安 Nghe An 荣市 Vinh 宁平 Ninh Binh 宁平 Ninh Binh 宁顺 Ninh Thuan 藩朗-塔占 Phan Rang-Thap Cham 富安 Phu Yen 绥和 Tuy Hoa 广平 Quang Binh 洞海 Dong Hoi 广南-岘港 Quang Nam-Da Nang 岘港 Da Nang 广义 Quang Ngai 广义 Quang Ngai 广宁 Quang Ninh 鸿基 Hon Gai 广治 Quang Tri 东河 Dong Ha 朔庄 Soc Trang 朔庄 Soc Trang 小河 Song Be 土龙木 Thu Dau Mot 山萝 Son La 山萝 Son La 西宁 Tay Ninh 西宁 Tay Ninh 太平 Thai Binh 太平 Thai Binh 清化 Thanh Hoa 清化 Thanh Hoa 承天-顺化 Thua Thien-Hue 顺化 Hue 前江 Tien Giang 美 My Tho 宣光 Tuyen Quang 宣光 Tuyen Quang 茶荣 Tra Vinh 茶荣 Tra Vinh 永隆 Vinh Long 永隆 Vinh Long 永富 Vinh Phu 越池 Viet Tri 安沛 Yen Bai......>> 问题五:"越南的海防市"用英语怎么说阿? Haiphong Hai Phong City H?i Phòng 海防市是越南北方最大的港口城市和最大的工业城市之一,位于红河 三角洲上,北与广宁省交界;东临北部湾;西距河内104公里。市区沿京泰河左岸向两头延伸,除了陆地部分外,还包括一部分海岛,面积1503平方公里。海防市市区辖鸿庞、黎真、吴权3个郡,郊区包 括吉海、安海、水 源、永宝、先浪、建安、涂山7个县,人口142万,市区人口约30万。 问题六:“越南”用英语怎么说 Vietnam 英[?vjet"n?m] 美[?vjet"n?m] n. 越南; [例句]The Vietnam War was just about to end. 那时越南战争就要结束了。 问题七:越南的河内用英语怎么说 Hanoi in Vietnam 问题八:越南和河内的英文分别是什么? 河内 [ hé nèi ] . . Hanoi 越南 . 郸 Vietnam 问题九:越南胡志明,河内等大城市的英文怎么说 河内 Hanoi 胡志明市 Thanh Pho Ho Chi Minh / Ho Chi Minh City 海防 Hai Phong / Haiphong 越南地名中英文对照表 安江 An Giang 龙川 Long Xuyen 巴地-头顿 Ba Ria-Vung Tau 头顿 Vung Tau 北太 Bac Thai 太原 Thai Nguyen 槟知 Ben Tre 槟知 Ben Tre 平定 Binh Dinh 归仁 Quy Nhon 平顺 Binh Thuan 藩切 Phan Thiet 芹苴 Cao Tho 芹苴 Can Tho 高平 Cao Bang 高平 Cao Bang 多乐 Dac lac 邦美蜀 Buon Me Thuot 同奈 Dong Nai 边和 Bien Hoa 同塔 Dong Thap 高岭 Cao Lamh 嘉莱 Gia Lai 波来古 Play Ku 河北 Ha Bac 北江 Bac Giang 河江 Ha Giang 河江 Hai Duang 海兴 Hai Hung 海阳 Hai Duang 河西 Ha Tay 河东 Ha Dong 河静 Ha Tinh 河静 Ha Tinh 和平 Hoa Binh 和平 Hoa Binh 庆和 Khanh Hoa 芽庄 Nha Trang 昆嵩 Kon Tum 昆嵩 Kon Tum 建江 Kien Giang 迪石 Rach Gia 莱州 Lai Chau 莱州 Lai Chua 林同 Lam Dong 大叻 Da Lat 谅山 Lang Son 谅山 Lang Son 老街 Lao Cai 老街 Lao Cai 隆安 Long An 新安 Tan An 明海 Minh Hai 金瓯 Ca Mau 南河 Nam Ha 南定 Nam Dinh 义安 Nghe An 荣市 Vinh 宁平 Ninh Binh 宁平 Ninh Binh 宁顺 Ninh Thuan 藩朗-塔占 Phan Rang-Thap Cham 富安 Phu Yen 绥和 Tuy Hoa 广平 Quang Binh 洞海 Dong Hoi 广南-岘港 Quang Nam-Da Nang 岘港 Da Nang 广义 Quang Ngai 广义 Quang Ngai 广宁 Quang Ninh 鸿基 Hon Gai 广治 Quang Tri 东河 Dong Ha 朔庄 Soc Trang 朔庄 Soc Trang 小河 Song Be 土龙木 Thu Dau Mot 山萝 Son La 山萝 Son La 西宁 Tay Ninh 西宁 Tay Ninh 太平 Thai Binh 太平 Thai Binh 清化 Thanh Hoa 清化 Thanh Hoa 承天-顺化 Thua Thien-Hue 顺化 Hue 前江 Tien Giang 美 My Tho 宣光 Tuyen Quang 宣光 Tuyen Quang 茶荣 Tra Vinh 茶荣 Tra Vinh 永隆 Vinh Long 永隆 Vinh Long 永富 Vinh Phu 越池 Viet Tri 安沛 Yen Bai 安沛 Yen Ba......>> 问题十:越南用英语怎么说? Vietnam2023-06-28 22:20:381
handi 是越南哪个城市
你说的是Hanoi吧??越南没有Handi这个地方这个也不是越南语。。。如果是hanoi的话,就是河内。越南首都。2023-06-28 22:20:451
python语言汉诺塔(hanoi)问题
编辑器中输入的呀。贴代码出来,才好分析代码光这点图片2023-06-28 22:20:553
28 汉诺塔(Hanoi)问题一个典型的(?????)问-|||-题-|||-A.查找-|||-B
递归问题。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:(1)以C杆为中介,从A杆将1至n-1号盘移至B杆;(2)将A杆中剩下的第n号盘移至C杆;(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。这样问题解决了,但实际操作中,只有第二步可直接完成,而第一、三步又成为移动的新问题。以上操作的实质是把移动n个盘子的问题转化为移动n-1个盘,那一、三步如何解决?事实上,上述方法设盘子数为n, n可为任意数,该法同样适用于移动n-1个盘。因此,依据上法,可解决n -1个盘子从A杆移到B杆(第一步)或从B杆移到C杆(第三步)问题。现在,问题由移动n个盘子的操作转化为移动n-2个盘子的操作。依据该原理,层层递推,即可将原问题转化为解决移动n -2、n -3… … 3、2,直到移动1个盘的操作,而移动一个盘的操作是可以直接完成的。至此,我们的任务算作是真正完成了。而这种由繁化简,用简单的问题和已知的操作运算来解决复杂问题的方法,就是递归法。在计算机设计语言中,用递归法编写的程序就是递归程序。2023-06-28 22:21:021
汉诺塔问题,当盘子个数为10时,hanoi函数一共被调用了几次?
1023可以设一个计数器代码:#include "stdafx.h"#include <iostream>using namespace std;int pp = 0;void move(char src, char dest) { cout << src << "-->" << dest << endl;}void hanoi(int n, char src, char medium, char dest) { pp++; if (n == 1) move(src, dest); else { hanoi(n - 1, src, dest, medium); move(src, dest); hanoi(n - 1, medium, src, dest); }}int main(){ int m; cout << "Enter the number of diskes:"; cin >> m; cout << "the steps to moving" << m << "diskes:" << endl; hanoi(m, "A", "B", "C"); cout <<"times = "<< pp<<endl; return 0;}2023-06-28 22:21:111
C语言hanoi问题
程序有点问题,帮你改了:#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf("请输入碟子数:");scanf("%d",&m);printf("执行步骤: ");hanoi(m,"A","B","C");}voidhanoi(intn,charone,chartwo,charthree){voidmove(charx,chary);if(n==1)move(one,three);else //加花括号{//整个过程是一个递归的过程,一直到递归出口再往回返hanoi(n-1,one,three,two);//把上面的n-1个盘子,借助第3根柱子,移动到第2根柱子上move(one,three);//把最下面的一个盘子移动到最终的目标柱子上hanoi(n-1,two,one,three);//接下来把前面移动第2根柱子上的n-1个盘子中的n-2个盘子,借助第1根柱子,移动到第3根柱子上}}voidmove(charx,chary){printf("%c-->%c ",x,y);}//测试结果:2023-06-28 22:21:171
汉诺塔特等奖是啥
汉诺塔特等奖是指对汉诺塔问题的有效求解所颁发的奖项。特等奖这个奖项本质上是一种学术奖项,旨在表彰对汉诺塔问题的研究和解决方案做出杰出贡献的学者、科学家和研究者。奖项包括金奖、银奖、铜奖等不同等级,获奖者可以获得奖金和荣誉证书等奖励。汉诺塔(Hanoi)问题是数学中的经典问题之一,涉及到递归和算法设计等多个领域。它的形式化描述如下:现有三根杆子,第一根杆子上有A、B、C三个盘子,大小依次为:A盘最大,B盘次之,C盘最小。要求将这三个盘子从第一根杆子移到第三根杆子上,并且保持原有的顺序,即在移动的过程中不允许把较大的盘子放到较小的盘子之上。汉诺塔问题的解法非常有趣。其解法具有递归的特点,可以广泛地应用于算法和程序设计中。2023-06-28 22:21:351
如何用C语言设计hanoi函数
懂?2023-06-28 22:21:532
C++ hanoi塔函数递归问题
用新值重新执行本函数,就像调用其它函数一样2023-06-28 22:22:022
证明hanoi塔问题的递归算法与非递归算法实际上是一回事
奇妙的问题实际上你需要形式化的描述这两种算法,才有可能证明他们是等价的吧我比较好奇,有没有例子,证明其他某种算法的递归与非递归的等价性,很好奇这种东西是怎么证明的...另外,参考资料里面的那只是你同学么...2023-06-28 22:22:112
汉诺塔的算法
用不了这么复杂,设A上有n个盘子。如果n=1,则将圆盘从A直接移动到C。如果n=2,则:1.将A上的n-1(等于1)个圆盘移到B上;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个圆盘移到B上;第二步 把A上的一个圆盘移到C上;第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。 显然这是一个递归过程,据此算法可编程如下:move(int n,int x,int y,int z){ if(n==1) printf("%c-->%c ",x,z); else { move(n-1,x,z,y); printf("%c-->%c ",x,z); move(n-1,y,x,z); }}main(){ int h; printf(" input number: "); scanf("%d",&h); printf("the step to moving %2d diskes: ",h); move(h,"a","b","c");}2023-06-28 22:22:218
C++解决 数学典型问题 Hanoi(汉诺)塔问题。
这是利用了递归的。将n个盘子分解成上边的n-1个和下边的1个。这样就可以看成是两个盘子,然后再把其余过程递归。那么对于这两个“盘子”来说,hanoi(n-1,one,three,two)是把上边的n-1个从one借助three移动到two;再把下边的最大的盘子从one移动到three;接着再把刚才的那堆“盘子”hanoi(n-1,two,one,three)从two借助one移动到three。这样就移动完了,对每个大堆“盘子”一递归就把具体过程做出来了。2023-06-28 22:22:471
汉罗塔hanoi
楼主写的程序是正确的,不知道你是什么意思/public class Hanoi {public static void main(String args[]){int n=3;hanoi(n,"A","B","C");}static void moves(char a,char c){System.out.println("From"+a+"To"+c);}static void hanoi(int n,char a,char b,char c){if(n==1){moves(a,c);}else{hanoi(n-1,a,c,b);moves(a,c);hanoi(n-1,b,a,c);}}}这个是Java的2023-06-28 22:22:541
汉诺塔问题
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。 后来,这个传说就演变为汉诺塔游戏: 1.有三根杆子A,B,C。A杆上有若干碟子 2.每次移动一块碟子,小的只能叠在大的上面 3.把所有碟子从A杆全部移到C杆上 经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 此外,汉诺塔问题也是程序设计中的经典递归问题。 算法思路: 1.如果只有一个金片,则把该金片从源移动到目标棒,结束。 2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒 (非专业人士可以忽略以下内容) 补充:汉诺塔的算法实现(c++) #include <fstream> #include <iostream> using namespace std; ofstream fout("out.txt"); void Move(int n,char x,char y) { fout<<"把"<<n<<"号从"<<x<<"挪动到"<<y<<endl; } void Hannoi(int n,char a,char b,char c) { if(n==1) Move(1,a,c); else { Hannoi(n-1,a,c,b); Move(n,a,c); Hannoi(n-1,b,a,c); } } int main() { fout<<"以下是7层汉诺塔的解法:"<<endl; Hannoi(7,"a","b","c"); fout.close(); cout<<"输出完毕!"<<endl; return 0; } C语言精简算法 /* Copyrighter by SS7E */ #include<stdio.h> /* Copyrighter by SS7E */ void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */ { if(n==1) { printf("Move disk %d from %c to %c ",n,A,C); } else { hanoi(n-1,A,C,B); /* Copyrighter by SS7E */ printf("Move disk %d from %c to %c ",n,A,C); hanoi(n-1,B,A,C); /* Copyrighter by SS7E */ } } main() /* Copyrighter by SS7E */ { int n; printf("请输入数字n以解决n阶汉诺塔问题: "); scanf("%d",&n); hanoi(n,"A","B","C"); }/* Copyrighter by SS7E */ PHP算法: <?php function hanoi($n,$x,$y,$z){ if($n==1){ move($x,1,$z); }else{ hanoi($n-1,$x,$z,$y); move($x,$n,$z); hanoi($n-1,$y,$x,$z); } } function move($x,$n,$z){ echo "move disk ".$n." from ".$x." to ".$z."<br>"; } hanoi(10,"x","y","z"); ?> JAVA算法: public class Haniojava { public static void main(String args[]) { byte n=2; char a="A",b="B",c="C"; hanio(n,a,b,c); } public static void hanio(byte n,char a,char b,char c) { if(n==1) System.out.println("move "+a+" to "+b); else { hanio((byte)(n-1),a,c,b); System.out.println("move "+a+" to "+b); hanio((byte)(n-1),c,b,a); } } } #include<iostream.h> void move(char ch1, char ch2) { cout<<ch1<<"->"<<ch2<<" "; } void hanoi(int n, char a, char b, char c) { if (n==1) move (a,c); else { hanoi (n-1,a,c,b); move (a,c); hanoi (n-1,b,a,c); } } void main() { int m; cout<<"Enter the number of disk to move: "; cin>>m; cout<<"The step to moving "<<m<<" disk: "; hanoi (m,"A","B","C"); cin>>m; } 用不了这么复杂 ,设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n=2,则: 1.将A上的n-1(等于1)个圆盘移到B上; 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个圆盘移到B上; 第二步 把A上的一个圆盘移到C上; 第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。 当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。 显然这是一个递归过程,据此算法可编程如下: move(int n,int x,int y,int z) { if(n==1) printf("%c-->%c ",x,z); else { move(n-1,x,z,y); printf("%c-->%c ",x,z); move(n-1,y,x,z); } } main() { int h; printf(" input number: "); scanf("%d",&h); printf("the step to moving %2d diskes: ",h); move(h,"a","b","c"); }2023-06-28 22:23:011
c语言hanoi塔问题程序中hanoi(n-1,one,three,two)的执行过程是怎么的?
My name is liao yu Bing2023-06-28 22:23:117
什么是递归表
是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。汉诺塔问题,是常见可用递归解决的问题,不过也有非递归的解法。菲波纳契数列可用递归定义。以下为求汉诺塔问题的Pascal程序:procedure Hanoi(n:integer;x,y,z:char);beginif n<>1 then beginHanoi(n-1,x,z,y);writeln(x,n,z);Hanoi(n-1,y,x,z);else writeln(x,n,z);end;end;上述程序用接近自然语言的伪代码可表述如下:Hanoi 过程 (整型参数n; 字符型参数 x,y,z);//注:n 代表本步中要处理的盘子数,x,y,z 分别表示 n 号盘子原来所在柱子、经由柱子、目标柱子开始如果 n 不为 1 ,那么:开始调用 Hanoi 过程 (参数为 n-1,x,z,y);//注:这一步表示用本过程方法将剩余 n-1 个盘子从柱子 x 经由柱子 z 移动到柱子 y输出 x,n,z; //注:表示将 n 号盘子从 x 移动到 z调用 Hanoi 过程 (参数为 n-1,y,x,z);//注:这一步表示用本过程方法将剩余 n-1 个盘子从柱子 y 经由柱子 x 移动到柱子 z结束; //以上程序段就完成了把 n 个盘子从柱子 x 经由柱子 y 移动到柱子 z否则 输出 x,n,z; //注:若 n 为1 的话本句直接输出表示将 n 号盘子从 x 移动到 z结束;2023-06-28 22:23:501
汉诺塔问题!!!
数学归纳法:一个盘子的话,一次就OK,记A1=1两个盘子,分三步: 1.将B最上面的一个盘子移到C上,就个就是上面一个盘子的情况,即A1次 2.将B最下面的盘子移到A上,一次就好。 3.将C的所有盘子(1个),移到A上面,即A1次。也就是A2=2A1+1=3 =2^2-1三个盘子,分三步: 1.将B最上面的两个盘子移到C上,即A2次 2.将B最下面的盘子移到A上,一次就好。 3.将C上面的两个盘子,移到A上,即A2次。也就是A3=2A2+1=7=2^3-1同理,n个盘子的情况: 1.将B上面的n-1个盘子移到C上,即An-1次 2.将B最下面的盘子,移到A上,一次就好 3.将C上面的两个盘子,移到A上,即An-1次也就是An=2An-1 +1=2^n-12023-06-28 22:23:592
c语言汉诺塔.
#include <stdio.h>#include <stdlib.h>void hanruota(int n,char a,char b,char c){ if(n==1) printf("将%d从%c移动到%c: ",n,a,c); else { hanruota(n-1,a,c,b); printf("讲%d从%c移动到%c: ",n,a,c); hanruota(n-1,b,a,c); } }int main( ){ int n=4; char A="a"; char B="b"; char C="c"; hanruota(n,A,B,C); system("PAUSE"); return 0;}//因等级没到2级所以效果图就不附上了。2023-06-28 22:24:064
汉诺塔的C语言代码怎么写啊
#includevoidsolve(intnum,intz1,intz2,intz3);voidmain(){intn;printf("请输入盘子数量:");scanf("%d",&n);solve(n,1,2,3);}voidsolve(intnum,intz1,intz2,intz3){if(num>0){solve(num-1,z1,z3,z2);printf("把%d上的盘子移到%d上 ",z1,z2);solve(num-1,z3,z2,z1);}}2023-06-28 22:24:143
递归算法怎么理解
问题一:递归算法还不是很理解!!高手教一教! 递归(recursion)是指把一个大的问题转化为同样形式但小一些的问题加以解决的方法。C语言允许一个函数调用它本身,这就是递归调用。即在调用一个函数的过程中又直接或间接地调用函数本身。不加控制的递归都是无终止的自身调用,程序中是绝对不应该出现这种情况的。为了防止无休止的递归,程序中应控制递归的次数,在某条件成立时进行递归,条件不成立不进行递归调用。并且在递归的调用过程中,不断改变递归的条件,以使递归条件不再成立。 同一问题可能既可以用递归算法解决,也可以用非递归算法解决,递归往往算法设计简单,出奇制胜,而普通算法(通常用循环解决)往往设计稍复杂。但执行效率递归算法逊于循环算法。递归反复调用自己,需要占用较多内存和计算机时间。但有一些问题只有用递归方法才能解决,如著名的汉诺塔问题。 递归程序设计的关键就是考虑问题的两种情况,一种是普遍情况即函数值等于把问题递推一步后的本函数的调用,一种是极端或端点情况,此时函数值有确定的一个值而无须再调用本函数。递归的过程就是从普遍情况逐步过渡到端点情况的过程。 例子: 5个坐在一起论年龄,问第五个人多少岁?他说比第四个人大两岁。问第四个人多少岁,他说比第三个人大两岁。问第三个人多少岁,他说比第二个人大两岁。问第二个人多少岁,他说比第一个人大两岁。问第一个人多少岁,他说10岁。请问第五个人几岁? int age(int n) { int x; if(n>1) x=age(n-1)+2; else if(n==1) x=10; return x; } void main( ) { printf(%d,age(5));} 问题二:什么是递归算法 递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙但是开销很大的算法。 比如: 汉诺塔的递归算法: void move(char x,char y){ printf(%c-->%c ,x,y); } void hanoi(int n,char one,char two,char three){ /*将n个盘从one座借助two座,移到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 n; printf(input the number of diskes:); scanf(%d,&n); printf(The step to moving %3d diskes: ,n); hanoi(n,"A","B","C"); } 我说下递归的理解方法 首先:对于递归这一类函数,你不要纠结于他是干什么的,只要知道他的一个模糊功能是什么就行,等于把他想象成一个能实现某项功能的黑盒子,而不去管它的内部操作先,好,我们来看下汉诺塔是怎么样解决的 首先按我上面说的把递归函数想象成某个功能的黑盒子,void hanoi(int n,char one,char two,char three); 这个递归函数的功能是:能将n个由小到大放置的小长方形从one 位置,经过two位置 移动到three位置。那么你的主程序要解决的问题是要将m个的汉诺块由A借助B移动到C,根据我们上面说的汉诺塔的功能,我相信傻子也知道在主函数中写道:hanoi(m,A,B,C)就能实现将m个块由A借助B码放到C,对吧?所以,mian函数里面有hanoi(m,"A","C","B");这个调用。 接下来我们看看要实现hannoi的这个功能,hannoi函数应该干些什么? 在hannoi函数里有这么三行 hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); 同样以黑盒子的思想看待他,要想把n个块由A经过B搬到C去,是不是可以分为上面三步呢? 这三部是:第一步将除了最后最长的那一块以外的n-1块由one位置经由three搬到two 也就是从A由C搬到B 然后把最下面最长那一块用move函数把他从A直接搬到C 完事后 第三步再次将刚刚的n-1块借助hanno处函数的功能从B由A搬回到C 这样的三步实习了n块由A经过B到C这样一个功能,同样你不用纠结于hanoi函数到底如何实现这个功能的,只要知道他有这么一个神奇的功能就行 最后:递归都有收尾的时候对吧,收尾就是当只有一块的时候汉诺塔怎么个玩法呢?很简单吧,直接把那一块有Amove到C我们就完成了,所以hanoni这个函数最后还要加上 if(n==1)move(one,three);(当只有一块时,直接有Amove到C位置就行)这么一个条件就能实现hanoin函数n>=1时......>> 问题三:怎么更好地终极理解递归算法 递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。 需注意的是,规模大转化为规模小是核心思想,但递归并非是只做这步转化,而是把规模大的问题分解为规模小的子问题和可以在子问题解决的基础上剩余的可以自行解决的部分。而后者就是归的精髓所在,是在实际解决问题的过程。 问题四:怎样才能深刻理解递归和回溯? 递归的精华就在于大问题的分解,要学会宏观的去看问题,如果这个大问题可分解为若干个性质相同的规模更小的问题,那么我们只要不断地去做分解,当这些小问题分解到我们能够轻易解决的时候,大问题也就能迎刃而解了。如果你能独立写完递归创建二叉树,前序、中序、后序递归遍历以及递归计算二叉树的最大深度,递归就基本能掌握了。 回溯本人用得很少,仅限于八皇后问题,所以帮不上啥了。 问题五:二叉树的递归算法到底该怎么理解 这不就是在二叉排序树上的递归查找,看程序 tree& find(const T& d, tree& t){ if(t==NULL) return t;如果二叉树为空则返回空,查找失败 if(t->data==d) return t;否则,如果当前根结点关键码为d,则查找成功,当前根结点为待查找结点 if(d>t->data) return find(d, t->right);如果比根的关键码大就递归查找右子树 return find(d, t->left);如果比根的关键码小就递归查找左子树 } 二叉树的递归定义的含义就是非空二叉树,除了根以外,左右子树都是二叉树(可以为空) 问题六:怎么理解递归算法?我看了代码但还是不理解? 函数自己调用自己就是递归啊。 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事。讲的内容是: 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲 从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事…… 跟循环差不多。而且浪费栈空间,效率不高。能够转化为循环最好。 问题七:数据结构中的二叉树中的递归怎么理解? 以中序遍历为例,思想是: 若二叉树为空,则空操作;否则 (1)中序遍历左子树 (中序遍历左子树时也是这三步) (2)访问根结点 (3)中序遍历右子树 (当然右子树也是重复着三步) 示例代码: int InOrderTraverse(BiTree T) { if(T) { InOrderTraverse(T->lchild); printf(%d ,T->data); InOrderTraverse(T->rchild); } return OK; } 问题八:java递归算法,怎么理解??? n! = (n-1)*n! 简单理解,就是目前的所有任务,等于前面所有的任务+现在的任务。 比如你求 1。。。100的加法总和 实际上是 1... 99 的加法总和 + 100 就是了。 这就是递归的来源。 你只需要计算你前一步的任务,然后加上自己,就OK了。 前一步,在再次调用前前一步...... 问题九:新手一个,有什么更好理解递归的方法吗?(c++) 递归的话就是重复调用方法直到满足条件为止就停止这个方法,就跟循环类似,不过循环使用的方法一边比较简单 问题十:递归的原理解释 递归的底层实现其实是一个栈.栈的特点是后进先出,也就是最后进入栈的事件是最先被处理的. 递归就是这样运作.比如计算阶乘函数F(n)=n!=n*F(n-1)=.... 写成递归,我用java public static long F(long num){ if(num2023-06-28 22:24:201
怎么证明hanoi塔问题递归与不递归本质是一样的
证明:设解决汉诺塔问题的函数为Hanoi(n,A,B,C)用数学归纳法即可证明上述问题当n=1和n=2时容易直接验证。设当k<=n-1时,递归算法和非递归算法产生完全相同的移动序列。考察k=n时的情形。将移动分为顺时针移动(S),逆时针移动(N)和非最小圆盘塔间的移动(F)三种情况。(1)当n为奇数时,顺时针非递归产生的移动序列为S,F,S,F,······S,逆时针非递归算法产生的序列为N,F,N,F,······N。当n为偶数时,顺时针非递归产生的移动序列为N,F,N,F,······N,逆时针非递归算法产生的序列为S,F,S,F,······S。(2)当n为奇数时,顺时针递归算法Hanoi(n,A,B,C)产生的移动序列为Hanoi(n-1,A,C,B)产生的移动序列,F,Hanoi(n-1,C,B,A)产生的移动序列其中,Hanoi(n-1,A,C,B)Hanoi(n-1,C,B,A)均为偶数圆盘逆时针移动问题。由数学归纳法知,它们产生的移动序列均为S,F,S,F,······S。因此Hanoi(n,A,B,C)产生的移动序列为S,F,S,F,······S。当n为偶数时,顺时针递归算法Hanoi(n,A,B,C)产生的移动序列为Hanoi(n-1,A,C,B)产生的移动序列,F,Hanoi(n-1,C,B,A)产生的移动序列其中,Hanoi(n-1,A,C,B)Hanoi(n-1,C,B,A)均为奇数数圆盘逆时针移动问题。由数学归纳法知,它们产生的移动序列均为N,F,N,F,······N。因此Hanoi(n,A,B,C)产生的移动序列为N,F,N,F,······N。当n为奇数和偶数时的逆时针递归算法也类似。由数学归纳法可知,递归算法和非递归算法产生相同的移动序列。2023-06-28 22:24:271
如何用matlab来求解汉诺(Hanoi)塔问题
function move(n,A,B)if n == 1; disp(["Move ",num2str(A)," to ",num2str(B)]);else move(n-1,A,6-A-B); move(1,A,B); move(n-1,6-A-B,B);end输入:move(4,1,3)结果:Move 1 to 2Move 1 to 3Move 2 to 3Move 1 to 2Move 3 to 1Move 3 to 2Move 1 to 2Move 1 to 3Move 2 to 3Move 2 to 1Move 3 to 1Move 2 to 3Move 1 to 2Move 1 to 3Move 2 to 32023-06-28 22:24:342
C语言程序,汉诺塔问题,下面hanoi函数执行的顺序是什么?每行分别执行几次,n的实时值是几多?
对c语言汉诺塔问题不懂的建议研究一下此链接里的内容http://wenku.baidu.com/link?url=7uD_LXAbXpBSscyQ_484LL9GN9tfq-WBu_pUKoFefq7WserlNYkbf6-5TUZP0ybkv8Be6n87XeLoeGeVMHB6ALgOpdLeknksZ62I7A53QCa觉得不错还望采纳2023-06-28 22:25:221
河内的解释
河内的解释 [Hanoi] 越南 民主 共和 国首都和全国最大河港,人口257万(1979) 详细解释 (1).古代指 黄河 以北的地区。 《周礼·夏官·职方氏》 :“ 河 内曰 冀州 。” (2).专指 河南省 黄河 以北的地区。 《 左传 ·定公十三年》 :“锐师伐 河 内,传必数日而后及 绛 。” 《孟子·梁惠王上》 :“ 河 内凶,则移其民於 河东 ,移其粟於 河内 。” 宋 梅尧臣 《卫州通判赵中舍》 诗:“我久在 河内 ,颇知 卫 风俗 。” 词语分解 河的解释 河 é 水道的通称:河道。河沟。河谷。河流。河滩。河沿。河鲜(供食用的新鲜河鱼、河虾等)。河港。河湾。河网。河运。内河。 特指 中国 黄河:河套。河防。 指“银河系”:天河。 河汉 。 笔画数:; 部首 :氵 内的解释 内 è 里面,与“外” 相对 :内部。内外。内定。内地。内阁。内行(俷 )。内涵。 称 妻子 或妻子家的 亲戚 :内人。内亲。内弟。 亲近 :内 君子 而外 小人 。 外 内 à 古同“纳”,收入;接受。 外 笔画数:2023-06-28 22:25:291
用C语言解决Hanoi双塔问题 设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
次数是 2^(2*n) - 1 次int hanoi(int n){ int x = 1; for (int i = 0; i < n + n; ++i) { x += x; } x--; return x;}2023-06-28 22:25:381
汉诺塔问题?
不是一次性把n-1个盘子从A移到C,是要借助B和C,来回倒,最终把n-1个盘子移动到C。是讲的移动思路,不是一次的步骤。2023-06-28 22:25:453
汉诺塔循环
不会2023-06-28 22:25:532
c语言汉诺塔问题
是的,要移植递归到 n == 1的时候,才会开始有调用move函数,当n==1之后,函数就返回到上一次的hanoi函数(也就是else中的第一个hanoi)的结束,接着在再次调用move函数, 在接下来就又是上面的过程了,移植到所有的递归都结束,才会重新返回main函数。其实递归就是自己调用自己的过程,只不过在某一个特定的条件下才能结束自己2023-06-28 22:26:011
Hanoi双塔 公式推导
hggvgghcgccccgh2023-06-28 22:26:082
ACM c语言
#include<stdio.h>void main(){ void hanoi(int n,char one,char two,char three); int m; printf("input the number of disks:"); scanf("%d",&m); printf("The step to moving %d disks: ",m); hanoi(m,"A","B","C");}void hanoi(int n,char one,char two,char three){ void move(char x,char y); if(n==1) move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); }}void move(char x,char y){ printf("%c-->%c ",x,y);}这个在ACM书上有的,经典问题2023-06-28 22:26:151
什么叫做 Tower of Hanoi???!!!(一个数学游戏)
盘子分别为A,B,C,珠子分别为1,2,3,4,1、1-B2、2-C3、1-C4、3-B5、1-A6、2-B7、1-B8、4-C9、1-C10、2-A11、1-A12、3-C13、1-B14、2-C15、1-Cover2023-06-28 22:26:237
想问hanoi是越南哪个城市
首都。第二大城市。河内(Hanoi)作为越南首都和第二大城市,融合了1000多年的历史和现代化的发展。河内丰富的历史文物,遍布的名胜古迹,使它获得了“千年文物之地”的美称。河内是最能代表越南社会主义风格的地方。大街小巷的革命口号涂鸦,满街穿着奥黛的美丽姑娘,摩托车从身边呼啸而过,窄窄的独栋小屋上画着五彩缤纷的图案,都能明确地告诉你,你在越南。河内位于越南北部,1-3月天气凉爽,降雨少;4-9月进入雨季,温度不断升高,时有台风,应随身携带雨伞;10-12月气温回落,天气凉爽舒适,此期间是欧美游客前往河内旅游的旺季,住宿价格上涨。盾,是越南的货币单位。一些海外越南人,如美籍越南人称“盾”为“VND”,即“越南盾”的意思。目前,游客常见的有1万、2万、5万、10万、20万及50万等五种面额的纸币。兑换:1人民币≈3408.16越南盾,1美元≈21264越南盾,10000越南盾≈2.94人民币,10000越南盾≈0.47美元。更多关于hanoi是越南哪个城市,进入:https://www.abcgonglue.com/ask/97c4c61655789423.html查看更多内容2023-06-28 22:26:481
请问hanoi是越南哪个城市
首都。第二大城市。河内(Hanoi)作为越南首都和第二大城市,融合了1000多年的历史和现代化的发展。河内丰富的历史文物,遍布的名胜古迹,使它获得了“千年文物之地”的美称。河内是最能代表越南社会主义风格的地方。大街小巷的革命口号涂鸦,满街穿着奥黛的美丽姑娘,摩托车从身边呼啸而过,窄窄的独栋小屋上画着五彩缤纷的图案,都能明确地告诉你,你在越南。河内位于越南北部,1-3月天气凉爽,降雨少;4-9月进入雨季,温度不断升高,时有台风,应随身携带雨伞;10-12月气温回落,天气凉爽舒适,此期间是欧美游客前往河内旅游的旺季,住宿价格上涨。盾,是越南的货币单位。一些海外越南人,如美籍越南人称“盾”为“VND”,即“越南盾”的意思。目前,游客常见的有1万、2万、5万、10万、20万及50万等五种面额的纸币。兑换:1人民币≈ 3408.16越南盾,1美元≈ 21264越南盾,10000越南盾≈ 2.94人民币,10000越南盾≈ 0.47美元。更多关于hanoi是越南哪个城市,进入:https://www.abcgonglue.com/ask/97c4c61655789423.html查看更多内容2023-06-28 22:26:551
hanoi是越南哪个城市
首都。第二大城市。河内(Hanoi)作为越南首都和第二大城市,融合了1000多年的历史和现代化的发展。河内丰富的历史文物,遍布的名胜古迹,使它获得了“千年文物之地”的美称。河内是最能代表越南社会主义风格的地方。大街小巷的革命口号涂鸦,满街穿着奥黛的美丽姑娘,摩托车从身边呼啸而过,窄窄的独栋小屋上画着五彩缤纷的图案,都能明确地告诉你,你在越南。河内位于越南北部,1-3月天气凉爽,降雨少;4-9月进入雨季,温度不断升高,时有台风,应随身携带雨伞;10-12月气温回落,天气凉爽舒适,此期间是欧美游客前往河内旅游的旺季,住宿价格上涨。盾,是越南的货币单位。一些海外越南人,如美籍越南人称“盾”为“VND”,即“越南盾”的意思。目前,游客常见的有1万、2万、5万、10万、20万及50万等五种面额的纸币。兑换:1人民币≈ 3408.16越南盾,1美元≈ 21264越南盾,10000越南盾≈ 2.94人民币,10000越南盾≈ 0.47美元。更多关于hanoi是越南哪个城市,进入:https://www.abcgonglue.com/ask/97c4c61655789423.html查看更多内容2023-06-28 22:27:021
汉诺塔问题是用什么方法求解的一个典型问题
用递归方法求解的一个典型问题。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。2023-06-28 22:27:081
什么叫汉诺塔问题?
C程序#include "stdio.h"main(){void hanoi(int,char,char,char);int m;printf("input the number of disks:");scanf("%d",&m);printf("The step to moving %d disks: ",m);hanoi(m,"A","B","C");}void hanoi(int n,char a,char b,char c){void move(char,char);if(n==1) move(a,c);else{hanoi(n-1,a,c,b);move(a,c);hanoi(n-1,b,a,c);}}void move(char x,char y){printf("%c-->%c ",x,y);}2023-06-28 22:27:173
如何推导汉诺塔的公式
汉诺塔通项公式汉诺塔问题家传户晓,其问题背景不做详述,此处重点讲解在有3根柱子的情况下,汉诺塔问题求解的通项公式的推导。问题背景:有A,B和C三根柱子,开始时n个大小互异的圆盘从小到大叠放在A柱上,现要将所有圆盘从A移到C,在移动过程中始终保持小盘在大盘之上。求移动盘子次数的最小值。变量设置:n为圆盘个数,H(k)为n=k时移动盘子次数的最小值。递推公式: H(k)=2H(k-1)+1。通项公式:H(k)=2^k-1。证明:(1)证明递推公式:首先被移动到C盘的必定是最大的盘子,否则必定违反“在移动过程中始终保持小盘在大盘之上”的规定。既然要将最大盘移动到C,此时最大盘之上必定没有任何盘子,亦即它独自在一根柱子上,要做到这点最优做法当然是先把较小的n-1个盘子由A移动到B,剩下最大盘独自在A。将n-1个盘由A移动到B花费的最少次数为H(n-1)。此时再将最大盘由A移动到C,此时移动总次数为H(n-1)+1。接着把剩下的n-1个盘由B移动到C,花费的最少次数当然也是H(n-1)。于是得到总移动次数2H(n-1)+1.证得H(k)=2H(k-1)+1。(2)推导通项公式。由H(k)=2H(k-1)+1得H(k)+1=2(H(k-1)+1),于是{H(k)+1}是首项为H(1)=1,公比为2的等比数列,求得H(k)+1 = 2^k,所以H(k) = 2^k-12023-06-28 22:27:262
C语言题——汉诺塔问题
我记得这个题目好像是用到了递归。。。很多书上貌似都有这个问题的 程序实例。。2023-06-28 22:27:362
不用自定义函数编写hanoi塔(C语言)
什么叫不用自定义函数写Hanoi?是不是就是非递归写法。。可是可以实现,就是这样做时间复杂度和空间复杂度都和原来的用递归写的一样,而且还更加难以看懂得了。我还是给你写一份吧。。。。#include <stdio.h> #include <stdlib.h> #define N 4 int count = 1; int ldx(int, int); void MoveHanoi(int, char, char); void Hanoi(char, char, char); int main() { char a = "A",b = "B",c = "C"; Hanoi(a, b, c); return 0; } int ldx(int a,int x) { int sum = 1; for (; x > 0; x--) { sum *= a; } return sum; } void MoveHanoi(int j, char ch1, char ch2) { printf("%d (%c,%c)%d ", j, ch1, ch2, count++); } void Hanoi(char a,char b,char c) { int n = 1,j = 1; char temp; if (!(N % 2)) { temp = b; b = c; c = temp; } while (n < ldx(2,N)) { j = 1; while (j <= N) { if (n % ldx(2,j) == ldx(2,j-1)) { if (j % 2 == 1) { if (n % (3 * ldx(2,j)) == ldx(2,j-1)) { MoveHanoi(j,a,c); break; } if (n % (3 * ldx(2,j)) == 3 * ldx(2,j-1)) { MoveHanoi(j,c,b); break; } if (n % (3 * ldx(2,j)) == 5 * ldx(2,j-1)) { MoveHanoi(j,b,a); break; } j++; } else { if (n % (3 * ldx(2,j)) == ldx(2,j-1)) { MoveHanoi(j,a,b); break; } if (n % (3 * ldx(2,j)) == 3 * ldx(2,j-1)) { MoveHanoi(j,b,c); break; } if (n % (3 * ldx(2,j)) == 5 * ldx(2,j-1)) { MoveHanoi(j,c,a); break; } j++; } } else j++; } n++; } } //以上都是非递归写的,看起来相当的麻烦,我这个人比较啰嗦,虽然你不想有递归的,但是我看你给的是50分,我还是再给你附一份用递归写的Hanoi吧。。。。#include<stdio.h>void move(char x,char y){printf("%c-->%c ",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); }}int main(){int n;scanf("%d",&n);hanoi(n,"A","B","C");return 0;}//我分析一下。两份代码的时间复杂度都很高是2的n次方,也就是说,计算到大概30的样子就已经非常的。。。慢了。而且我个人还是推荐你理解第二份递归程序。因为递归是非常有用的方法,递归、回溯、DFS。。。。。。。扯远了。。。。2023-06-28 22:27:431
递归 汉诺塔
void hanoi ( int n, char a, char b, char c ) { if ( n >= 1 ) { hanoi ( n-1, a, c, b ) ; printf(“%c --> %c ”, a , c) ; hanoi ( n-1, b, a, c ) ; } }void main () { int n ; printf( " Input the number of diskes: “) ; scanf(“%d”,&n) ; hanoi ( n, "A" , "B" , "C" ) ; }2023-06-28 22:27:571
求真正理解汉诺塔问题的编程大神回答一下,当n=3时,用c语言编写的汉诺塔递归调用代码的详细执行过程
理解汉诺塔问题,可以先抛开递归这件事,就问题本身来讨论,先不要看程序。三个柱子上,小的圆盘一定在大的上面。把A柱上的盘子n号盘子移到B柱上,分成两步,1)把n之前的移走,2)把n号盘移到B柱上,3)把n之前的盘子移回来。先把这个问题本身搞清楚,再来讨论程序实现。把n之前的盘子移走这个事,不是简单的一次就可以移走的,这是一个过程。这个过程要借助C柱,移动n-1个盘子的过程,与移动n个盘子的过程相比,除了数量少一个,目标是A到C,没有本质的不同,这也是使用递归的基础。把解决问题的过程弄明白了,再来看程序就比较容易了。n=3,移动3个盘子实际上我们如果手工去做,要这样,1# A-B2# A-C1# B-C3# A-B,这时3#已经就位。1# C-A2# C-B1# A-B这是移动3个盘子,从A-B。要移动第4个盘子,这时就可以做了 4# A-C,然后重复前面的过程,把3个盘子移动到过来。不过刚才移动的3个盘子是A-B,现在则是B-C,但基本的过程是一样的。具体 的程序看百科看吧。2023-06-28 22:28:182
河内塔(THE TOWER OF HANOI)描述的递归原理
河内塔是有国数学家爱德华·卢卡斯于1883发明的.给定一个由8个圆盘组成的塔,这些圆盘按照大小递减的方式套在三根桩柱中的一根上. 我们先以最少的大小两个圆盘来说 T 0 =0 T n =2T n-1 +1 正常的递归公式已经完成。我们可以进一步进行公式演算(数学归纳法) T 0 +1=1 T n +1=2T n-1 +2 如果令U n =T n +1,那么就有 U n =2U n-1 =>U n =2 n 如是推导出2023-06-28 22:28:241
C++ 汉诺塔步数
int hanoi(int n,char one,char two,char three, int steps){ if(n==1){move(one,three, ++steps); return steps;} else { steps = hanoi(n-1,one,three,two, steps); move(one,three, ++steps); return hanoi(n-1,two,one,three, steps); }}main 函数里面这样调用:hanoi(m,"a","b","c",0);2023-06-28 22:28:311
汉诺塔问题公式是什么?
parcel:::::::::: program hanoi;functionhanoi(x:integer):longint;begin if x=1 then hanoi:=1; if x=2 then hanoi:=3; else begin hanoi:=2*hanoi(x-1)+1; end;end;begin read(x){第几个数 } write(hanoi(x));end.思想就是:第N个就等于第n-1个乘以2+1次2023-06-28 22:28:4012
c++汉诺塔非递归算法
哈哈 很简单的:我说下递归的理解方法(拿你说的汉诺塔做例子),简单的话给我加分哦 ~亲首先:对于递归这一类函数,你不要纠结于他是干什么的,只要知道他的一个模糊功能是什么就行,等于把他想象成一个能实现某项功能的黑盒子,而不去管它的内部操作先,好,我们来看下汉诺塔是怎么样解决的。(借用一下楼下的代码 呵呵)首先按我上面说的把递归函数想象成某个功能的黑盒子,void hanoi(int n,char one,char two,char three); 这个递归函数的功能是:能将n个由小到大放置的小长方形从one 位置,经过two位置 移动到three位置。那么你的主程序要解决的问题是要将m个的"汉诺块"由A借助B移动到C,根据我们上面说的汉诺塔的功能,我相信傻子也知道在主函数中写道:hanoi(m,A,B,C)就能实现将m个块由A借助B码放到C,对吧?所以,看楼下的主程里面有hanoi(m,"A","C","B");这个调用。接下来我们看看要实现hannoi的这个功能,hannoi函数应该干些什么?在hannoi函数里有这么三行hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);同样以黑盒子的思想看待他,要想把n个块由A经过B搬到C去,是不是可以分为上面三步呢?这三部是:第一步将除了最后最长的那一块以外的n-1块由one位置经由three搬到two 也就是从A由C搬到B 然后把最下面最长那一块用move函数把他从A直接搬到C 完事后 第三步再次将刚刚的n-1块借助hannoi函数的功能从B由A搬回到C 这样的三步实习了n块由A经过B到C这样一个功能,同样你不用纠结于hanoi函数到底如何实现这个功能的,只要知道他有这么一个神奇的功能就行最后:递归都有收尾的时候对吧,收尾就是当只有一块的时候汉诺塔怎么个玩法呢?很简单吧,直接把那一块有Amove到C我们就完成了,所以hanoni这个函数最后还要加上 if(n==1)move(one,three);(当只有一块时,直接有Amove到C位置就行)这么一个条件就能实现hanoin函数n>=1时将n个块由A经由B搬到C的完整功能了。递归这个复杂的思想就是这样简单解决的,呵呵 不知道你看懂没?纯手打,希望能帮你理解递归总结起来就是不要管递归的具体实现细节步骤,只要知道他的功能是什么,然后利用他自己的功能通过调用他自己去解决自己的功能(好绕口啊,日)最后加上一个极限情况的条件即可,比如上面说的1个的情况。的图象变换了吗?注意如下“翻折”变换: 你熟2023-06-28 22:29:021
越南大学排名
根据网络资源,越南目前有超过二百所中高等教育机构,其中大学(即university)有112所。一般来说,中国留学生到越南留学都是为了更好地掌握越南语这一小语种,根据近年来东南亚国家越来越快的发展趋势,也有很多中国学生抱着提前投资的心态前往越南。越南的大学教育质量并族橘缺不是很好,甚至美国排名大社US News 上都没有越南大学的排名情况(特指其所列举的、有排名的亚洲国家中并没有越南),而QS亚洲大学排名中有两所,分别为越南国立大学河内,以及越南国立大学河内胡志明市。但以下还是提供网络上最全的有关越南的大学排名中的前十大学名单,以供参考:兆辩Webmetrics越南大学排名(最新):越南国立大学,河内(Vietnam National University, Hanoi),本国排名:1,世界排名:894芹苴大学(Can Tho University),本国排名:2,世界排名:1790河内国立教育大学(Hanoi National University of Education),本国排名:3,世界排名:2154岘港大学(University of Da Nang),本国排名:4,世界排名:2222越南农林大学(Ho Chi Minh City University of Agriculture and Forestry, or Nong Lam University),本国排名:5,世界排名:2781Duy Tan University(位于岘港,暂无可靠中文译名),本国排名:6,世界排名:3008顺化大学(Hue University),本国排名:7,世界排名:3253胡志明市科技大学(Ho Chi Minh City University of Technology),本国排名:8,世界排名:3279越南国立大学胡志明市国际大学(International University, National University HCM City),本国排名:9,世界排名:3527越南国立大学胡志明市(Vietnam National University Ho Chi Minh City),本国排名:10,世界排名:35362023-06-28 22:29:091