• 汉诺塔问题的递归解法和非递归解法(python语言实现)


    1. 汉诺塔问题的非递归解法(python语言类解法)

    #!/usr/bin/env python
    #coding:utf-8

    import sys
    import time
    reload(sys)
    sys.setdefaultencoding('utf-8')
    class Mycolumns(object):
    val=0
    #__slots__ = ['plates','name']
    def __init__(self,name='',plates_num=0):
    self.name = name
    self.plates = []
    if plates_num > 0 :
    for i in range(0,plates_num):
    self.plates.append(n-i)
    @staticmethod
    def fun():
    Mycolumns.val +=1
    print"this is the %d th time to move" %(Mycolumns.val)
    【这段可以用类方法代替】
    @classmethod
        def fun(cls):
            cls.val +=1
            print"this is the %d th time to move" %(cls.val)

    def initialize(n):
    stack = []
    mycolumn1 = Mycolumns('A',n)
    if n%2 == 0:
    mycolumn2 = Mycolumns('B')
    mycolumn3 = Mycolumns('C')
    index = 2
    else:
    mycolumn2 = Mycolumns('C')
    mycolumn3 = Mycolumns('B')
    index = 1
    stack.append(mycolumn1)
    stack.append(mycolumn2)
    stack.append(mycolumn3)
    return stack,index

    def nowcolumn(i,stack):
    for item in stack:
    if i in item.plates:
    return item

    def nextcolumn(i,stack):
    for item in stack:
    if i in item.plates:
    if i%2!=0:
    next = (stack.index(item)+1)%3
    else:
    next = (stack.index(item)+2)%3
    #print "%d next column is %s"%(i,stack[next].name)
    return stack[next]

    def move(nowcolumn,nextcolumn):
    n = nowcolumn.plates.pop()
    nextcolumn.plates.append(n)
    print "move plate %d from %s to %s" %(n,nowcolumn.name,nextcolumn.name)
    Mycolumns.fun()

    def hannuoyi(n):
    stack,index = initialize(n)
    #max = pow(2,n)-1
    #k =0
    #while(k<max):
       FINAL = []
       for i in range(0,n):
      FINAL.append(n-i)
       while(stack[index].plates!=FINAL):
            for i in range(1,n+1):
    #print "i value is %d" %(i)
    if(nowcolumn(i,stack).plates.index(i)==len(nowcolumn(i,stack).plates)-1 and (nextcolumn(i,stack).plates==[] or i< nextcolumn(i,stack).plates[-1])):
    move(nowcolumn(i,stack),nextcolumn(i,stack))
    #k = k+1
    else:
    pass
    #print"can not move plate %d" %(i)

    print stack[0].plates,stack[0].name
    print stack[1].plates,stack[1].name
    print stack[2].plates,stack[2].name
    if __name__=="__main__":
    n=3
    hannuoyi(n) 

      2. 汉诺塔问题的非递归解法(python语言过程式解法)

    #!/usr/bin/env python
    #coding:utf-8
     
    import sys
    import time
    reload(sys)
    sys.setdefaultencoding('utf-8')
    global a
    a =0
    def fun():
        global a
        a = a+1
        print"this is the %d th time to move" %(a)
     
    def nowcolumn(i,stackA,stackB,stackC):
        if i in stackA:
            return stackA
        elif i in stackB:
            return stackB
        else:
            return stackC
     
    def nextcolumn(n,i,stackA,stackB,stackC):
        if n%2==0:
            if i in stackA:
                if i%2!=0:
                    newcolumn = stackB
                else:
                    newcolumn = stackC
            if i in stackB:
                if i%2!=0:
                    newcolumn = stackC
                else:
                    newcolumn = stackA
            if i in stackC:
                if i%2!=0:
                    newcolumn = stackA
                else:
                    newcolumn = stackB
        else:
            if i in stackA:
                if i%2==0:
                    newcolumn = stackB
                else:
                    newcolumn = stackC
            if i in stackB:
                if i%2==0:
                    newcolumn = stackC
                else:
                    newcolumn = stackA
            if i in stackC:
                if i%2==0:
                    newcolumn = stackA
                else:
                    newcolumn = stackB
        return newcolumn
    def move(nowcolumn,nextcolumn):
        n = nowcolumn.pop()
        nextcolumn.append(n)
        print "move plate %d" %(n)
        fun()
     
     
    def hannuoyi(n):
        stackA = []
        stackB = []
        stackC = []
        FINAL = []
        for i in range(0,n):
            stackA.append(n-i)
            FINAL.append(n-i)
        print stackA,stackB,stackC,FINAL
     
        while(stackC!=FINAL):
            for i in range(1,n+1):
                print "i value is %d" %(i)
                if(nowcolumn(i,stackA,stackB,stackC).index(i)==len(nowcolumn(i,stackA,stackB,stackC))-1 and (nextcolumn(n,i,stackA,stackB,stackC)==[] or i< nextcolumn(n,i,stackA,stackB,stackC)[-1])):
                    move(nowcolumn(i,stackA,stackB,stackC),nextcolumn(n,i,stackA,stackB,stackC))
                else:
                    print"can not move plate %d" %(i)
                print stackA,stackB,stackC
    if __name__=="__main__":
        n=6
        hannuoyi(n)
    1. 汉诺塔问题的递归解法(python语言)
    #!/usr/bin/env python
    #coding:utf-8
     
    import sys
     
    reload(sys)
    sys.setdefaultencoding('utf-8')
    global a
    a =0
    def fun():
        global a
        a = a+1
     
    def hannuoyi(n,A,B,C):
        if n==1:
            move(1,A,C)
        else:
            hannuoyi(n-1,A,C,B)
            move(n,A,C)
            hannuoyi(n-1,B,A,C)
     
    def move(n,tempA,tempB):
        print "move plate %d from column %s to column %s" %(n,tempA,tempB)
        fun()
    if __name__=="__main__":
        hannuoyi(3,'A','B','C')
        print "total:we need %d steps"%(a) 
  • 相关阅读:
    idea报错。Error:Failed to load project configuration: cannot parse xml file E:project.ideaworkspace.xml: Error on line 1: 前言中不允许有内容。
    数据库索引的使用
    sql查询每个学生的最高成绩mysql语句
    Tomcat下没有编译后的class文件
    fullpage中大的图片超过一屏怎么在手机端滑动显示?
    springmvc拦截器的配置、使用
    过滤器、拦截器中重定向无限循环问题解决
    Linux下的Memcache安装
    Windows下的Memcache安装
    jQuery学习资源参考教程网址推荐
  • 原文地址:https://www.cnblogs.com/qianqian-li/p/6673758.html
Copyright © 2020-2023  润新知