c语言用递归实现汉诺塔
递归算法是我前些天写的,非递归是刚才找的,里面含递归和非递归。
第一步,n-1个金片从a经c移动到b 不是“一步”完成的,而是“一个阶段”(一次递归调用)完成的。在假定它完成的基础上,第二步就可以完成了。
/***汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b。第二,把a上的最下面的盘移到c。a成了空的。第三,因为n-1个盘全在b上了,所以把b当做a.重复以上步骤就好了。所以算法看起来就简单多了。
这样,然而,完成第一步和第三步也同样是一个移动n-1个盘子的汉诺塔问题。于是,递归调用在这里不可避免。程序你已经写的很清楚,给你解释一下。现把你的程序画上行以便说明。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
圆盘逻辑移动过程+程序递归过程分析 hanoi塔问题, 算法分析如下,设a上有n个盘子,为了便于理解我将n个盘子从上到下编号1-n,标记为盘子1,盘子..盘子n。如果n=1,则将“ 圆盘1 ” 从 a 直接移动到 c。
C语言汉诺塔问题非递归解法代码求大神讲解
首先必须确定一个移动的方向,比如A-B-C,或者A-C-B,但这个顺序一旦却确定后就不可以再改变了的,否则永远都不会成功。然后一直按下面两个步骤循环,直到全部完成。
递归算法是我前些天写的,非递归是刚才找的,里面含递归和非递归。
非递归,要C语言自己琢磨琢磨吧,我无能为力。http://blog.sina.com.cn/s/blog_68507b0a0100onrr.html 记住这个规律,以后玩汉诺塔基本上就是体力劳动了。规律:先小后大,单左双右,循环。
从B,通过A,移动到C上面,就完成了,因为你最下面的一个盘子你已经移过去了。如果当n1的时候,始终递归调用hannuota这个函数,直到最后n==1这样的话,就可以通过上面的n==1操作来完成了。就是递归的终点了。
要看懂递归程序,往往应先从最简单情况看起。先看hanoi(1, one, two, three)的情况。这时直接将one柱上的一个盘子搬到three柱上。
汉诺塔n=4(4个盘)c语言递归编程代码
我没看你的具体代码,如果逻辑错误没有问题的话,那么最有可能导致WA的原因就是数据范围问题。
程序走到第12行,因为此时n=4,而不等于1,程序直接走第13行。于是调用第14行的hanoi(n-1,a,c,b)。这是一个递归调用。此时,n=3,a=A,c=B,b=C。要清楚,A,B,C代表的意义。
所以结果非常简单,就是按照移动规则向一个方向移动金片:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出递归和非递归的不同实现源代码。
如何做一个C语言编程的汉诺塔游戏?
//汉诺塔x层塔从A塔整体搬到C塔,中间临时B塔。//x层塔是从大到小往上叠放。每次移动只能移动一层塔。
先看hanoi(1, one, two, three)的情况。这时直接将one柱上的一个盘子搬到three柱上。注意,这里one柱或three柱到底是A、B还是C并不重要,要记住的是函数第二个参数代表的柱上的一个盘被搬到第四个参数代表的柱上。
) movedisc(n-1,a,c,b);2) 将一个盘子从a移动到b上;3) movedisc(n-1,c,b,a);重复以上过程,直到将全部的盘子移动到位时为止。
每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。因此,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。
比如Hanoi(n-1,A,C,B)表示借助C座把n- 1个盘子从A座移动到B座。Move函数的第一个参数表示源座,第二个参数代表目的座。Move函数的功能是将源座最上面的一个盘子移动到目的座上。