汉诺塔问题的非递归解法(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

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)

汉诺塔问题的递归解法(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)

python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...相关推荐

  1. 盖塔机器人好_[转载]盖塔机器人的十大谜团

    近来适逢盖塔皇帝第一次推出超合金玩具,又勾起了我多年来埋藏在心底里的盖塔魂,这篇博文也是我念念不忘想写下来的文章之一,是自娱自乐性质关于盖塔之谜的解读,如能有缘得到同好拜读请一定不惜留言交流! 先声明 ...

  2. python 无法引入同级目录的方法_再见 virtualenv!K神教你轻松管理多个Python环境...

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货第一时间推给你!!! 小编电脑上有多个 Python 开发环境,每次都是用 virtualenv ...

  3. python递归汉诺塔详解_汉诺塔在python中递归,理解磁盘目的地的变化

    我正在努力提高我对python中hanoi之塔递归解决方案代码的理解. 此代码:def moveTower(height,fromPole, toPole, withPole): if height ...

  4. python递归详解+汉诺塔小案例_汉诺塔,python递归实现解法步骤

    def hanoi(n,x,y,z):#函数实现n个盘子在x,y,z,移动 if n==1: print(x, ' --> ', z) else: hanoi(n-1,x,z,y)#将n-1层个 ...

  5. 二叉树层序遍历递归与非递归_二叉树基础(1)-构建和遍历(递归和非递归)...

    二叉树的构建有2种方式:1.直接输入数字.2.根据两种顺序来判断另外一中顺序(后面会提到) 这里分享第一种构建方式,二叉树的前中后三种遍历方式(递归和非递归版本),和二叉树的层次遍历. 见代码demo ...

  6. python setattr无限递归_如何避免使用setattr和属性setter来避免递归循环?

    在调用setattr时,当试图设置某个带有setter的属性的值时,这将导致无限递归循环:class TypeSystem(object): def __setattr__(self, key, va ...

  7. java 什么时候用递归_如果要用Java实现算法,一定慎用递归

    现象 : 递归是我们很经典的一种算法实现,可以很好的描述一个算法的原理!对于算法的描述.表现和代码结构理解上,递归都是不错的选择! 但是本文想说的是java实现一个递归算法的时候尽量不要用递归实现,而 ...

  8. python摄像头识别快递单号查询_免费对接快递鸟api单号识别查询接口(python)

    由于自己网站需要对接一些物流查询快递,然后在网上搜了一圈发现快递鸟比较适合我 之前写快递api的时候,官网上只有php和.net的示例,而我使用python封装的相关功能踩了许多坑,才搞出来,分享一下 ...

  9. python手写多个字母识别_一个带界面的CNN手写数字识别,使用Python(tensorflow, kivy)实现...

    CNN_Handwritten_Digit_Recognizer (CNN手写数字识别) A CNN handwritten digit recognizer with graphical UI, i ...

最新文章

  1. 右键助手1.0正式版
  2. laravel数据迁移的时候遇到的字符串长度的问题
  3. 经典C语言程序100例之二四
  4. hive 中某个字段等于0_快速了解hive
  5. Links about 技术大牛Joseph Yiu ...姚文祥(Joseph Yiu)
  6. 最多只能选择两个多选框的jQuery功能实现
  7. 深度学习推荐模型-DIN
  8. samba和nfs的自动挂载
  9. Java进阶:The driver is automatically registered via the SPI and manual loading of the driver class is
  10. 思科网院Packet Tracer实验(七)IP编址
  11. PAT之树:一般树、二叉树、完全二叉树、二叉搜索树、二叉平衡树、并查集
  12. TCP协议以及TCP的三次握手和四次挥手
  13. 华为性格测试通关指南
  14. MapGIS出现“存储服务错误,可能未启动”问题解决方案
  15. GIS实验之根据建筑物走向和方向角进行区域划分
  16. 闭关之 Vulkan 应用开发指南笔记(四):绘制、几何体片段处理、同步和回读数据
  17. linux signal用法,Linux 信号 signal 用法详解及注意事项
  18. libxml使用实例
  19. 计算机文化基础期末考试复习
  20. Linux系统下如果查看用户的UID和GID

热门文章

  1. epoll浅析以及nio中的Selector
  2. 进程和线程(4)-进程 vs. 线程
  3. zabbix 服务器监控之数据库操作
  4. edit box小技巧
  5. 转:LoadRunner检查点使用小结
  6. [转载] 民兵葛二蛋——第31集
  7. [转载] python可视化分析(matplotlib、seaborn、ggplot2)
  8. [转载] python实现堆排序用类的方法_python实现堆排序的实例讲解
  9. 新增字段属性“是否转义”,提高列表展示性能
  10. Response JSON数据返回