m0_74158882 2022-12-27 11:30 采纳率: 42.9%
浏览 55
已结题

python汉诺塔堆栈(ListStack)实现

汉诺塔问题用递归实现非常简单,但是如何把递归转换成栈(stack)
请用ListStack解法
附上测试方法


if __name__ == '__main__':
    n = 3
    result_list = HanoiTower(n)
    for item in result_list:
        print(item)

附上输出格式

img

  • 写回答

3条回答 默认 最新

  • ShowMeAI 2022-12-27 11:39
    关注

    使用栈(stack)解决汉诺塔问题,可以记录每一步的状态,并将其压入栈中。当需要移动盘子时,再从栈中弹出状态,然后执行这一步。

    • 使用一个状态类来存储每一步的状态。这个类应该包含源柱子,辅助柱子和目标柱子的名称。
    • 使用一个ListStack类来存储每一步的状态。在每次移动盘子时,我们可以将新的状态压入栈中。

    下面是使用ListStack类解决汉诺塔问题的代码,以及测试用例,望采纳:

    class ListStack:
        def __init__(self):
            self.items = []
        
        def push(self, item):
            self.items.append(item)
        
        def pop(self):
            return self.items.pop()
        
        def is_empty(self):
            return self.items == []
        
        def peek(self):
            return self.items[-1]
        
    def HanoiTower(n, from_rod ='A', aux_rod ='B', to_rod ='C'):
        result_list = []
        stack = ListStack()
        stack.push((n, from_rod, aux_rod, to_rod))
        while not stack.is_empty():
            n, from_rod, aux_rod, to_rod = stack.pop()
            if n == 1:
                result_list.append(f"{from_rod} --> {to_rod}")
            else:
                stack.push((n-1, aux_rod, from_rod, to_rod))
                stack.push((1, from_rod, aux_rod, to_rod))
                stack.push((n-1, to_rod, aux_rod, from_rod))
        return result_list
    
    if __name__ == '__main__':
        n = 3
        result_list = HanoiTower(n)
        for item in result_list:
            print(item)
    

    运行结果截图如下:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月4日
  • 已采纳回答 12月27日
  • 修改了问题 12月27日
  • 修改了问题 12月27日
  • 展开全部

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题