首页 > 编程知识 正文

汉诺塔递归调用过程,labuladong的算法小抄pdf

时间:2023-05-06 02:23:19 阅读:153232 作者:1453

//刚接触编程的萌新,伟大的人请不要喷雾`

汉诺威的算法代码如下

c语言

**#includestdio.hint count=0; ` voidHan(chara,char b,char c,int n )//形式参加实参同名没有影响。 由于作用域不同,当然可以使用x y z代替if(n==1) printf(%c-%c(n ),a )来进行区分; (else ) Han ) a、c、b、n-1 ); printf(%c-%c(n ),a,c ); 出局; Han(b,a,c,n-1 ); } } int main () { char a='A ',b='B ',c='C '; int n; scanf('%d ',n ); Han(a,b,c,n ); printf('%d ',count; 返回0; }*要写程序,首先需要弄清楚算法。 请先理解Han(a,b,c,n )的意思。 我的理解是,A、b、c是诺塔的三个柱子,n是层数,Han ) A、b、c )可以看出a柱通过B柱最终到达了C柱。 分析一下你为什么这么想吧。 汉诺威要求大圆盘总是在小圆盘之下。 (按照从最上面最小、从最下面最大的顺序排列。 ) n=1时,我们只有一个圆盘。 这样我们只要从a柱移动到C柱就能达成目标。 这也就是if(n=1)正在做的事情。 那当n大于1时,我们怎么理解呢? 如果要移动a柱最小面的圆盘,我们必须去掉上面所有的n-1层圆盘,所以可以考虑把n-1层圆盘移动到b柱,露出最下面的圆盘,把最下面的圆盘从a柱移动到c。 这样的话,前面的n-1层圆盘是如何从a柱那里借c柱最终移动到b柱的,所以Han(a,c,b,n-1 ); //han (起始柱、租用的柱、目标柱、层数); 具体来说,n-1个圆盘如何运动是递归算法的妙处,让计算机一步步去计算(可以理解为成为了n-1层的新汉诺威)。 此时,我们要做的只是将b柱上的n-1层圆盘移动到c柱上。 因此,有Han(b,a,c,n-1 )。 实现也依赖递归。 这样显示各步骤的移动方法。 然后,考虑如何计算总步数。 我的代码在每一步都输出了printf。 那么,在每个printf之后添加count时; 最终计算的不是总步数吗?

今天刚学习的汉诺威,可能有理解不深或错误的地方。

作者zjy

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。