汉诺塔的2个非递归解法

关于汉诺塔的非递归解法,如果使用堆栈模仿递归解法的入栈出栈操作,则因为编译器产生的汇编指令,对递归解法的出入栈操作优化的效果,非递归解法没有明显的性能提升。这里收录了另外2个非递归解法写法,对栈的使用进行了改进:

func hanoi(n, a, b, c)
{
        abc=a+b+c;

        next:
        while (n>1) {
                --n;
                a[top]=a;
                b[top]=b;
                s[top++]=n;
                x =c; c=b; b=x;
        }
        print "pole:", a, "to", c;
        if(top>0) {
                n= s[--top];
                a=a[top];
                b=b[top];
                c=abc-a-b;
                print "pole:", a, "to", c;
                x =a; a=b; b=x;
                goto next;
        }
}
func hanoi(n, a, b, c)
{
        abc=a+b+c;

        a[top]=a;
        b[top]=b;
        s[top++]=n;
        while(top>0) {
                n= s[--top];
                a=a[top];
                b=b[top];
                c=abc-a-b;

                if (n==1) print "pole:", a, "to", c;
                else {
                        a[top]=b;
                        b[top]=a;
                        s[top++] = n-1;
                        a[top] = a;
                        b[top] = b;
                        s[top++] = 1;
                        a[top]= a;
                        b[top]= c;
                        s[top++] = n-1;
                }
        }
}

第一个参考了2叉树的非递归中序遍历算法。第二个采用压栈生成子任务思路,注意子任务的压栈顺序和实际执行相反。至此,用堆栈改进递归算法的学习终于可以毕业了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值