汉诺塔C递归算法详细解答

合集下载

python汉诺塔递归详解(一)

python汉诺塔递归详解(一)

python汉诺塔递归详解(一)Python汉诺塔递归解法引言汉诺塔(Hanoi Tower)是一种数学问题和益智游戏,由法国数学家爱德华·卢卡教授在19世纪初提出。

通过计算机编程解决汉诺塔问题,可以帮助我们更好地理解递归算法在编程中的应用。

问题描述在汉诺塔问题中,有三个柱子和一些圆盘,每个柱子上的圆盘按照从小到大的顺序叠放。

问题的目标是将所有圆盘从一根柱子移动到另一根柱子上,每次只能移动一个圆盘,并且在移动过程中不允许大圆盘放在小圆盘上面。

解法思路我们可以使用递归的方法解决汉诺塔问题。

下面是解决汉诺塔问题的基本步骤:1.将上面n-1个圆盘从A柱移动到B柱。

2.将最大的圆盘从A柱移动到C柱。

3.将B柱上的n-1个圆盘移动到C柱。

通过递归调用这三个步骤,可以将所有的圆盘从A柱移动到C柱。

代码实现以下是使用Python语言实现汉诺塔递归的代码:def hanoi(n, A, B, C):if n == 1:print("Move disk 1 from", A, "to", C) returnhanoi(n-1, A, C, B)print("Move disk", n, "from", A, "to", C) hanoi(n-1, B, A, C)# 测试代码hanoi(3, "A", "B", "C")运行结果运行上述代码,我们可以得到以下输出结果:Move disk 1 from A to CMove disk 2 from A to BMove disk 1 from C to BMove disk 3 from A to CMove disk 1 from B to AMove disk 2 from B to CMove disk 1 from A to C总结通过递归算法,我们可以轻松解决汉诺塔问题。

汉诺塔解题思路

汉诺塔解题思路

汉诺塔解题思路汉诺塔解题思路汉诺塔塔问题符合数学统计归纳,千万别试图去理解n层移动问题(或者说去理解n层递归,⼈脑真不够⽤),理解3层汉诺塔问题就⾏。

总结起来如下:递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。

解题算法1. 如果A柱⼦只剩⼀个盘⼦,那么直接移动到C柱⼦即可2. 把 n-1 号盘⼦移动到缓冲区3. 把1号从起点移到终点4. 然后把缓冲区的n-1号盘⼦也移到终点解题框架/*1.要从a到b 那c就是缓冲 move(n-1,from,to,buffer)2.要从a到c 那b就是缓冲 move(1,from,buffer,to)3.要从b到c 那a就是缓冲 move(n-1,buffer,from,to)*///汉诺塔移动框架void move(n,from,buffer,to){if (n == 1) {removeTo(from,to);return;}move(n-1,from,to,buffer);move(1,from,buffer,to);move(n-1,buffer,from,to);}void removeTo(List<Integer> from, List<Integer> to) {to.add(from.remove(from.size() - 1));}Java代码//汉诺塔问题解释https:///question/24385418public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {remove(A.size(),A,B,C);}private void remove(int n, List<Integer> from, List<Integer> buffer, List<Integer> to) {//如果A柱⼦只剩⼀个盘⼦,那么直接移动到C柱⼦即可if (n == 1) {removeTo(from,to);return;}//1.把 n-1 号盘⼦移动到缓冲区//把A柱⼦上⾯的n-1个盘⼦,借助辅助柱⼦C,放到柱⼦B上remove(n - 1, from, to, buffer);//2.把1号从起点移到终点//此时A柱⼦剩下那个盘⼦是n个盘⼦中最⼤的那个,把他移动到C柱⼦上remove(1, from,buffer,to);//3.然后把缓冲区的n-1号盘⼦也移到终点//最后把刚才放在B柱⼦上的n-1个盘⼦,借助柱⼦A辅助,放到柱⼦C上remove(n - 1, buffer, from, to);}private void removeTo(List<Integer> from, List<Integer> to) {to.add(from.remove(from.size() - 1));}。

四柱汉诺塔问题数学公式

四柱汉诺塔问题数学公式

四柱汉诺塔问题的数学推导简介汉诺塔问题是一种经典的数学难题,涉及到递归和数学推理。

该问题描述如下:有三根柱子,分别记为A、B、C,初始状态下,在A柱子上有一个由小到大依次排列的套圈。

现在的目标是将所有套圈按照相同的顺序搬到C柱子上,期间可以借助B柱子作为中间过渡。

同时,在四柱汉诺塔问题中,我们引入了第四根柱子D,当进行移动的圈数大于3时,可以在D柱子上进行临时存储。

问题分析首先,我们需要分析一下问题的关键要素: 1. 圈的数量:假设我们有n个圈需要移动 2. 柱子的数量:假设我们有m根柱子,其中m>3推导过程1. n=1时,m=3时的情况当n=1时,表示只有一个圈需要移动。

这时,根据汉诺塔问题的规则,我们可以直接将该圈从A柱子移动到C柱子上即可。

2. n=2时,m=3时的情况当n=2时,表示有两个圈需要移动。

这时,我们可以采用递归的思想,将问题分解为多个子问题。

具体步骤如下: - 步骤1:先将n-1个圈从A柱子移动到临时柱子B上; - 步骤2:将第n个圈从A柱子移动到目标柱子C上; - 步骤3:将n-1个圈从临时柱子B移动到目标柱子C上。

3. n>2时,m=3,4时的情况当n>2时,我们同样可以采用递归的思想,将问题分解为多个子问题。

不同的是,在四柱汉诺塔问题中,我们可以借助第四根柱子D来完成移动。

具体步骤如下: - 步骤1:先将n-m个圈从A柱子移动到临时柱子B上; - 步骤2:将前m个圈从A柱子移动到目标柱子D上; - 步骤3:将n-m个圈从临时柱子B移动到目标柱子C上; - 步骤4:将前m个圈从目标柱子D移动到目标柱子C上; - 步骤5:将n-m个圈从A柱子移动到目标柱子D上; - 步骤6:将前m个圈从目标柱子C移动到目标柱子D上; - 步骤7:将n-m个圈从A柱子移动到目标柱子C 上。

根据上述步骤,我们可以总结出递归的数学公式如下:H(n,m) = 2H(n-m,m)+2^m-1其中,H(n,m)表示有n个圈需要移动的情况下,借助m根柱子完成的最小次数。

采用递归和非递归方法求解hannol问题

采用递归和非递归方法求解hannol问题

采用递归和非递归方法求解hannol问题汉诺塔问题是数学中的经典问题之一,也被认为是计算机科学中的经典问题。

它的解法可以使用递归或非递归的方法。

在本文中,我们将介绍并比较这两种解法。

汉诺塔问题的描述是:有三根柱子,A、B、C,初始时,A柱子上有n个盘子,这些盘子从小到大按顺序堆叠在一起。

现在需要将这n 个盘子从A柱子移动到C柱子上,期间可以借助B柱子。

移动盘子有以下几个规则:1.每次只能移动一个盘子;2.盘子只能从大盘子移到小盘子上;3.在移动过程中,可以借助柱子进行中转。

接下来,我们将先介绍递归解法。

递归解法:对于n个盘子,我们可以将问题分解为以下三个步骤:1.将n-1个盘子从A柱子移动到B柱子;2.将第n个盘子从A柱子移动到C柱子;3.将n-1个盘子从B柱子移动到C柱子。

递归解法的代码如下:```pythondef hanoi(n, A, B, C):if n == 1:print("Move disk %d from %s to %s" % (n, A, C)) else:hanoi(n-1, A, C, B)print("Move disk %d from %s to %s" % (n, A, C)) hanoi(n-1, B, A, C)```在这个递归函数中,n表示盘子的数量,A、B、C表示三根柱子。

当n为1时,直接将第一个盘子从A柱子移动到C柱子;否则,先将n-1个盘子从A柱子移动到B柱子,然后将第n个盘子从A柱子移动到C柱子,最后将n-1个盘子从B柱子移动到C柱子。

递归的过程中,会不断地将问题分解为子问题,直到子问题规模减小到1。

下面是一个具体的例子,假设有3个盘子,初始时都在A柱子上:```pythonhanoi(3, 'A', 'B', 'C')```输出结果为:```Move disk 1 from A to CMove disk 2 from A to BMove disk 1 from C to BMove disk 3 from A to CMove disk 1 from B to AMove disk 2 from B to CMove disk 1 from A to C```如上所示,递归解法将问题分解为子问题,然后逐步解决子问题,最后得到整体的解。

用C语言解决汉诺塔问题的方法及过程分析

用C语言解决汉诺塔问题的方法及过程分析

( )将 原 问题 转化 成 新 问题 后 ,能使 求 解算法 的规模减 小. 2
( )递归 有一 个 明显 的 出 口,或称 为递 归的边 界 ,而边 界 问题 的解是显 而 易见 的或 已知 的. 3
3 用 C语 言 编 程
C语 言是 一种 在 国内外 广泛 流行 的高 级程 序设 计语 言 ,它 的语 言 功能 丰富 ,表达 力 强 ,使 用 灵 活 ,应
言 中 ,用 递归 法编 写 条件
2 1 递 归程序 定义 .
《 C程 序设 计 》 数 据结 构 》等教科 书 中 ,都对 递 归 程 序 给 出 了基本 相 同的定 义 ,归纳 如下 :在调 用 、《

个 函数 的过 程 中 ,又直接 或 间接地 调用 了该 函数本 身 ,称 为 函数 的递 归调 用 ,使用 了递 归调用 函数 的程
第 3期
{ a ( 一 , o e t r e t ) hn n1 n , h e , wo ;
mo e ( ne, t e ); v o hr e
h n ( 一 ,t a n 1 wo,o e h e ) ) n ,t r e ;)
ma n ( i )
{n i tn;
prn f ( “ e s nt rt mbe ike ” it Pla e e e he nu rofd s s: );
维普资讯
维普资讯
2 0 年 6月 06
河 北 北 方 学 院学 报 ( 自然 科 学 版 )
第 3 期
上操 作 的实质 是把移 动 n个 盘子 的 问题转 化 为移 动 n 一1个盘 .那 一 、三 步 如何解 决 ?事 实 上 ,上述 方法 设盘 子数 为 n ,n可 为任 意数 ,该 法 同样 适 用于 移动 n 1 盘. 因此 ,依 据 上 法 ,可解 决 n 一 个 一1个 盘子从 A杆 移 到 B杆 ( 一 步)或 从 B杆 移到 C杆 ( 第 第三 步 ) 问题 .现 在 ,问题 由移 动 n个 盘 子 的操 作转 化 为 移动 n 一2个 盘子 的操作 .依 据该 原 理 ,层 层递 推 ,即可将 原 问题 转化 为 解 决移 动 n 、n … …3 、 一2 一3 、2 直 到移动 1 盘 的操 作 ,而移 动一 个 盘 的操 作 是可 以 直接 完成 的. 至 此 ,我 们 的任 务 算作 是 真 正完 成 了. 个 而这 种 由繁化 简 ,用简单 的问题 和 已知 的操 作 运算来 解决 复杂 问题 的方 法 ,就是 递归法 . 在计算 机设计 语

python汉诺塔递归算法

python汉诺塔递归算法

python汉诺塔递归算法汉诺塔递归算法是一种经典的递归算法,用于解决汉诺塔问题。

汉诺塔问题是一个古老的数学问题,它由法国数学家爱德华·卢卡斯于1883年提出。

问题的描述如下:有三根柱子A、B、C,A柱子上有n个盘子,盘子大小不一,大的在下,小的在上。

现在要将A柱子上的盘子全部移到C柱子上,但是移动过程中有以下限制条件:1.每次只能移动一个盘子;2.大盘子不能放在小盘子上面。

汉诺塔递归算法的思路是将问题分解成若干个子问题,然后递归地解决这些子问题。

具体来说,我们可以将问题分解成三个步骤:1.将A柱子上的n-1个盘子移动到B柱子上;2.将A柱子上的最后一个盘子移动到C柱子上;3.将B柱子上的n-1个盘子移动到C柱子上。

这样,我们就将原问题分解成了三个子问题,而这三个子问题的解决方法与原问题是相同的,因此我们可以使用递归算法来解决这个问题。

下面是汉诺塔递归算法的Python代码实现:def hanoi(n, A, B, C):if n == 1:print(A, "->", C)else:hanoi(n-1, A, C, B)print(A, "->", C)hanoi(n-1, B, A, C)在这个代码中,n表示盘子的数量,A、B、C分别表示三根柱子。

当n等于1时,我们直接将A柱子上的盘子移动到C柱子上;当n 大于1时,我们先将A柱子上的n-1个盘子移动到B柱子上,然后将A柱子上的最后一个盘子移动到C柱子上,最后将B柱子上的n-1个盘子移动到C柱子上。

汉诺塔递归算法的时间复杂度为O(2^n),因为每个盘子都需要移动2^n-1次。

虽然时间复杂度很高,但是汉诺塔递归算法是一种非常优美的算法,它展示了递归算法的精髓,也是计算机科学中的经典问题之一。

汉诺塔的时间复杂度递推公式

汉诺塔的时间复杂度递推公式

汉诺塔的时间复杂度递推公式
汉诺塔问题是一个数学谜题,也是计算机科学中经典的问题之一。

汉诺塔问题需要将一堆盘子从一个柱子移动到另一个柱子,规则是每次只能移动一个盘子,并且大盘子不能放在小盘子上面。

汉诺塔问题在算法分析中具有重要性,因为它能够展示递归算法的应用。

在汉诺塔问题中,我们可以通过递归算法来解决。

假设我们有n 个盘子,它们被放置在柱子A上。

我们需要将它们全部移动到柱子C 上。

我们定义递归函数hanoi(n,A,B,C)表示将n个盘子从柱子A移
动到柱子C,其中B表示辅助柱子。

递归函数hanoi(n,A,B,C)的时间复杂度可以使用递推公式来表示:
T(n) = 2T(n-1) + 1
其中T(n-1)表示n-1个盘子从A移动到B所需的时间,2T(n-1)表示将n-1个盘子从A移动到B,再将最大的盘子从A移动到C,最
后将n-1个盘子从B移动到C所需的时间,1表示将最大的盘子从A
移动到C所需的时间。

由此递推得到时间复杂度:
T(n) = 2^n - 1
因此,汉诺塔问题的时间复杂度为指数级别,随着盘子数量的增加,时间复杂度增长非常快。

- 1 -。

c语言递归汉诺塔每一步详解

c语言递归汉诺塔每一步详解

递归汉诺塔是一个经典的递归问题,它要求将一堆圆盘从一根柱子移动到另一根柱子上,且规定不能通过其他圆盘。

这个问题可以通过递归算法来解决。

在每一步中,我们可以选择将当前最大的圆盘从起始柱子移动到目标柱子,或者将两个较小的圆盘移动到另一个柱子上。

递归函数需要考虑三个柱子的状态:起始柱子、目标柱子和柱子。

在函数中,我们需要判断当前情况是否可以进行移动,如果可以,则执行相应的移动操作,否则返回上一个递归函数继续执行。

最终,当所有圆盘都移到目标柱子上时,问题得到解决。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汉诺塔C递归算法详细解答
程序如下:
void move(char x,char y){
printf("%c-->%c\n",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",n);
hanoi(n,'A','B','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=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。

Hanoi塔问题中函数调用时系统所做工作
一个函数在运行期调用另一个函数时,在运行被调用函数之前,系统先完成3件事:
①将所有的实参、返回地址等信息传递给被调用函数保存。

②为被调用函数的局部变量分配存储区;
③将控制转移到被调用函数的入口。

从被调用函数返回调用函数前,系统也应完成3件事:
①保存被调用函数的结果;
②释放被调用函数的数据区;
③依照被调用函数保存的返回地址将控制转移到调用函数。

当有多个函数构成嵌套调用时,按照“后调用先返回”的原则(LIFO),上述函数之间的信息传递和控制转移必须通过“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就为其在栈顶分配一个存储区,每当从一个函数退出时,就释放其存储区,因此当前运行函数的数据区必在栈顶。

堆栈特点:LIFO,除非转移或中断,堆栈内容的存或取表现出线性表列的性质。

正是如此,程序不要求跟踪当前进入堆栈的真实单元,而只要用一个具有自动递增或自动递减功能的堆栈计数器,便可正确指出最后一次信息在堆栈中存放的地址。

一个递归函数的运行过程类型于多个函数的嵌套调用,只是调用函数和被调用函数是同一个函数。

因此,和每次调用相关的一个重要的概念是递归函数运行的“层次”。

假设调用该递归函数的主函数为第0层,则从主函数调用递归函数为进入第1层;从第i层递归调用本函数为进入下一层,即i+1层。

反之,退出第i层递归应返回至上一层,即i-1层。

为了保证递归函数正确执行,系统需设立一个“递归工作栈”,作为整个递归函数运行期间使用的数据存储区。

每一层递归所需信息构成一个“工作记录”,其中包括所有实参、所有局部变量以及上一层的返回地址。

每进入一层递归,就产生一个新的工作记录压入栈顶。

每退出一层递归,就从栈顶弹出一个工作记录,则当前执行层的工作记录必是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。

相关文档
最新文档