查看: 1273| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

[二分/排序/搜索] 请问一下,怎么用递归办法理解汉诺塔问题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
count = 0
def hanoi(n, src, dst, mid):
      global count
      if n==1:
         print("{}:{}->{}".format(1,src,dst))
         count +=1
      else:
         hanoi(n-1, src, mid, dst)
         print("{}:{}->{}".format(n,src,dst))
         count +=1
         hanoi(n-1, mid, dst, src)

hanoi(100, "A", "B", "C")
print(count)

想了一天,怎么也琢磨不明白,大家有什么巧妙的思考办法吗?

上一篇:刷题太累了,牢骚一下继续刷
下一篇:parse string problem
🔗
livtmy 2018-12-29 08:18:00 | 只看该作者
全局:
我是用的java,大致就是先把n-1个disks从src移到mid,然后把第n个disk从src移到dst,再把那n-1个disks从第mid移到dst,希望对你有用

    public void hanoi(int n, int src, int dst, int mid) {
        if (n == 0) return;
        hanoi(n - 1, src, mid, dst);
        System.out.println("Move disk " + n + " from peg " + src + " to peg " + dst);
        hanoi(n - 1, mid, dst, src);
    }

评分

参与人数 1大米 +1 收起 理由
14417335 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
1501171509 2018-12-29 09:40:31 | 只看该作者
全局:
原理和楼上说的一样
int h(int n) {
if(n == 1)
    return 1;
else
    return 2 * h(n-1 ) + 1;
}

h ( n-1) : source -> mid
1:   source -> dest
h(n-1) : mid -> dest

评分

参与人数 1大米 +1 收起 理由
14417335 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
WarriorZ 2018-12-29 12:40:33 | 只看该作者
全局:
其实主要的逻辑很简单,就是divide and conquer. 要解决输入规模为n的问题,我们就先要解决n -  1的问题,然后最后不断往下压触底,然后解决了n = 1的问题,我们就能解决n = 2 的问题,然后就是n = 3的问题,以此类推最后解决n = n的问题。汉诺塔问题的关键是有三个塔,一个是source,一个是buffer,一个是destination。在进行不同层之间的递归的时候,buffer和destination和buffer是要互相转换的。
public void main(String[] args) {
        int n = 3;       
        Tower[] towers = new Tower[n];
        for(int i = 0; i < 3; i ++) {
                towers[i] = new Tower(i);
        }

        for(int i = n - 1; i >= 0; i --) {
                towers[0].add(i);
        }
       
        towers[0].moveDisks(n, towers[2], towers[1]);
}

public class Tower {
        private Stack<Integer> disks;
        private int index;
        public Tower(int i) {
                disks = new Stack<Integer>();
                index = i;
        }
               
        public int index() {
                return index;
        }
       
        public void add(int d) {
                if(!disks.isEmpty() && disks.peek() <= d) {
                        System.out.println("Error placing disk" + d);
                } else {
                        disk.push(d);
                }
        }

        public void moveTopTo(Tower t) {
                int top = disk.pop();
                t.add(top);
        }

        public void moveDisk(int n, Tower destination, Tower buffer) {
                if(n > 0) {
                        moveDisks(n - 1, buffer, destination);
                        moveTopTo(destination);
                        buffer.moveDists(n - 1, destination, this);
                }
        }
}

评分

参与人数 1大米 +3 收起 理由
14417335 + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| springroll 2018-12-30 06:43:34 | 只看该作者
全局:
汉诺塔问题是不是只有用递归方法才能解决,用正向的迭代方法或者别的方法有可能解决吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表