ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

汉诺塔

2022-01-03 14:33:32  阅读:209  来源: 互联网

标签:柱子 柱上 目标 汉诺塔 盘子 移动


使用递归思想解决汉诺塔问题。

1.汉诺塔即一摞圆盘由大到小排列垒在一个柱子上,有三个柱子,将圆盘移到另一个柱子上保持顺序,一次只能移动一片,且大的不能在小的下面。

2.确定递归的退出条件,由极端情况来确定,例如此问题中圆盘只有一片时,只需直接移动即可。

3.如果有一片以上,假设有N片,则需要移动N-1片到别的柱子上再移动最后一片到目标盘上。

 

则由此得出,如果想移动第N篇,需要移动N-1,要移动N-1则需要移动N-2,依次类推知道最后调用移动最上层的一片,假设我们有三个盘子需要移动,那么先写出退出条件即盘子只有一个时的情况的语句:将盘子直接移动到目标柱子,盘子开始移动,结束。然后回退到上一层的调用,此时会发现我们可以移动第二个盘子了,但是不能直接移动到目标柱上,因此想完成将上两个盘子都移到目标柱子的步骤,则我们需要书写语句将第二片移动到我们的辅助柱上,再移动第一片回到初始柱,将第二片由辅助柱移动到目标柱,将第一片复位,则完成了将上两片移动到目标柱的步骤。然后再次回退到上一层,我们要移动第三片,依旧是发现无法直接移动到目标柱上,需要移动到辅助柱上,需要把前两片从目标柱上移走,当我们想要移动第二片时,会发现移不动,因为第一片在上面,则此处又开始递归调用直到最后一层即只有一片的时候,然后重复之前的动作。

则汉诺塔的实现函数

 public static void hanoi(int n,char A,char B,char C)
    {
        if(n == 1)
            TowersOfHanoi.move(1, A, C);
        else
        {//否则
            hanoi(n - 1, A, C, B);
            TowersOfHanoi.move(n, A, C);
            hanoi(n - 1, B, A, C);
        }
    }

我们会发现,在实现汉诺塔问题时,在内部实现里有并列的多次调用,并非只是简单的调用了一次。
递归法适用于解题步骤是按层次递进且具有重复性的情况下

标签:柱子,柱上,目标,汉诺塔,盘子,移动
来源: https://www.cnblogs.com/ouyangqing/p/15756068.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有