首页 > 编程知识 正文

汉诺塔递归调用过程,汉诺塔递归

时间:2023-05-05 06:56:02 阅读:153235 作者:2280

算法介绍

其实算法非常简单,假设盘子的数量是n,移动的次数应该是2 ^ n1 (感兴趣的人可以自己证明一下)。 后来,一位美国学者发现了一个意想不到的简单方法。 交替进行2个阶段的操作就可以了。 首先,将3根柱子按顺序排列成完成形,所有圆盘按大小顺序放置在柱子a上,根据圆盘的数量决定柱子的排出顺序。 n为偶数时,顺时针依次排列A B C;

在n为奇数的情况下,顺时针方向依次排列A C B。

将圆盘1从当前柱顺时针移动到下一柱。 也就是说,n为偶数时,如果圆盘1在柱子a上,将其移动到b上; 如果圆盘1在柱b上,将其移动到c; 如果圆盘1在柱c上,将其移动到a。

然后,将可以在其他两根柱子上移动的圆盘移动到新柱子上。 也就是说,将非空柱上的圆盘移动到空柱上,如果两个柱都不是空的,则移动大圆盘。 在这一步中,没有明确规定移动哪个圆盘。 你可能觉得有各种各样的可能性,但事实并非如此。 唯一可以实施的行动。

重复操作,最后汉诺威移动按规定完成。

结果非常简单,就是根据移动规则向一个方向移动金属片:

例如,三楼汉诺威移动: AC、AB、CB、AC、BA、BC、AC

# include iostream # include cstring # includefstreamusingnamespacestd; 长时间=0; //全局变量//次数voidmove(intn,char a,char b,char c )//编号为n的盘子从a到c time; if(n==1) cout ' movedisk ' n ' from ' a '-- ' c endl; }else{move(n-1,a,c,b ); //A上的1号到N-1号盘子从a到b,以C为辅助,输入Cout ' movedisk ' n ' from ' a '-- ' C endl; move(n-1,b,a,c ); //B上面的1号到N - 1号盘子从b到c,a作为辅助}}int main () {int m; cout ' inputthenumberofthedisk : ' endl; wile(CINm ) {cout流程如下。 ' endl; move(m,(a,) b,(c ) ); cout 'It needs ' time ' times'endl; cout ' inputthenumberofthedisk : ' endl; 时间=0; }

# include iostream # include cstring # includefstreamusingnamespacestd; 长时间=0; //全局变量//每次操作voidmove(chara,int n,char c ) ) /第n个盘子cout '第' time '次,表示将第' n '个盘子从' a '移动到' c endl '。 }voidHanobi(intn,char a,char b,char c ) if ) n==1) move(a ) a,1,c ); ELSE{Hanobi(n-1,a,c,b ); //A上的1号到N-1号盘子从a到b,c作为辅助move(A,n,c )。 Hanobi(n-1,b,a,c ); //B上面的1号到N - 1号盘子从b到c,a作为辅助}}int main () {int m; cout ' inputthenumberofthedisk : ' endl; wile(CINm ) {cout流程如下。 ' endl; Hanobi(m,' a ',' b ',' c ' ); cout 'It needs ' time ' times'endl; cout ' inputthenumberofthedisk : ' endl; 时间=0; }

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