- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的代码解决了 hanoi 使用预定义函数 moveLOD、swapLOI 和 swapLID 返回 Action 列表的问题。
MoveLOD:将 1 个圆盘从第一个位置移动到三元组第三个位置中的第三个销钉。此外,包含有关运动信息的字符串会堆积在字符串列表中。
type Pin = (Char, Int) -- Represents a rod, named for a character and the number of disks in it.
type Plate = (Pin, Pin, Pin) -- Represents the configuration of the three rods.(Origin,Intermediate,Destination
type Log = (Plate, [String]) -- Represents a state formed by the configuration of rods and a list of strings that will record the movements made by the algorithm.
moveLOD :: Log -> Log
moveLOD (((o,n), i ,(d,k)),s) = (((o,n-1), i ,(d,k+1)), (o:" -> " ++ [d]):s)
-- swapLOI: Change the positions of the origin rods and intermediate rods.
swapLOI:: Log->Log
swapLOI ((o,i,d),s) = ((i,o,d),s)
-- swapoLID : Change the positions of the intermediate rods and destination rods.
swapLID:: Log->Log
swapLID ((o,i,d),s) = ((o,d,i),s)
hanoi :: Log -> Log
hanoi:: Int->Log->[String]
hanoi 1 log = transformaLista(moveLOD log)
hanoi n log = hanoi (n-1) (swapLID log) ++ hanoi 1 log ++ hanoi (n-1) (swapLOI(log))
changeToList::Log->[String]
changeToList(p,s) = s
callHanoi:: Int->[String]
callHanoi n = hanoi n ((('O',n),('I',0),('D',0)),[])
最佳答案
hanoi :: Log -> Log
hanoi ((('o',0),i,d),s) = ((('o',0),('i',0),('d',0)), [])
hanoi ((('o',1),i,d),s) = moveLOD((('o',1),i,d),s)
hanoi ((('o',n),i,d),s)= hanoi(swapLOI(hanoi(swapLOI(swapLID(moveLOD(swapLID((('o',n),i,d),s)))))))
仅定义参数的函数,其中 Plate
的第一个 Pin
中的 Char
为 'o'
,当角色是其他东西时,您还需要提供方程。
当接收到的参数与任何有定义方程的模式不匹配时,会出现“非穷举模式”错误。解决这个问题的唯一方法是提供其余模式的方程。
在你修改后的代码中,首先,你对origin pin为空的情况的处理是不正确的,
hanoi (((o,0),i,d),s) = ((('o',0),('i',0),('d',0)),[])
意味着无论何时应用这种情况,无论d
和i
是什么,结果都是相同的。当从 chamahanoi
调用 hanoi
并使用大于 2 的参数时,有时原点会变空,并且由于调用链中只有 hanoi
和 swapLOI
,恒定的结果会冒泡。由于递归调用 hanoi
,您会得到 n == 2
的正确结果(n == 1
由第二个方程直接求解)那么两者的原极上都只有一个圆盘。
这种情况应该是
hanoi (((o,0),i,d),s) = (((o,0),i,d),s)
这仍然不会产生正确的结果(错误的移动顺序),因为一般情况下的递归是错误的。
你
swapLID . moveLOD . swapLID
);河内
),但这是不允许的,因为最小的圆盘位于中间销上,因此不能放置其他圆盘;你应该
n-1
个圆盘从原点移动到中间销,n-1
个磁盘从中间位置移动到目标位置。如果没有额外的参数来跟踪要移动的磁盘数量,我看不出有什么简单的方法可以做到这一点。考虑一个四盘游戏。首先,将顶部的三个圆盘移动到中间销,然后将底部的圆盘移动到目标销。现在的任务是使用原始引脚作为辅助,将三个圆盘从中间引脚移动到目标引脚。
正确的做法是顺序
i -> d
(([],[1,2,3],[4]) -> ([],[2,3],[1,4 ])
)i -> o
(([],[2,3],[1,4]) -> ([2],[3],[1,4] )
)d -> o
(([2],[3],[1,4]) -> ([1,2],[3],[4])
)i -> d
(([1,2],[3],[4]) -> ([1,2],[],[3,4] )
)o -> i
(([1,2],[],[3,4]) -> ([2],[1],[3,4] )
)o -> d
(([2],[1],[3,4]) -> ([],[1],[2,3,4] )
)i -> d
(([],[1],[2,3,4]) -> ([],[],[1,2,3, 4])
)在第 2 步之后,原始目标引脚将成为要将磁盘(好吧,一个)移动到 o
的引脚,但在这种情况下不应移动磁盘中最低的一个。如果唯一的信息是每个引脚上有多少个磁盘以及磁盘应从何处移动到何处,如何实现这一点?
如果将 hanoi
类型更改为
hanoi :: Int -> Log -> Log
并调用它
chamahanoi n = hanoi n ((('o',n),('i',0),('d',0)),[])
很容易实现。
如果您不想这样做,或者不允许这样做,您可以跟踪每个引脚上的大小,并且只将磁盘移动到较大的引脚上,或者您可以在适当的位置偷偷地删除和添加磁盘引脚来模拟该限制,但如果没有适当的解释,很难将其与作弊区分开来。
关于 haskell : Solving Towers of Hanoi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12760285/
在我的一个 Ansible 剧本中,我使用 vmware_guest在 vCenter Server 上创建 VM 的模块。当我使用作业模板在 Ansible Tower 上运行 Playbook 并
Ansible 塔中是否有办法暂停工作流模板执行并等待用户在完成作业模板后提供某种输入,例如“批准”或“拒绝”,然后继续下一个作业模板? 我正在尝试构建一个将有 5 个作业模板的工作流,但我希望在第二
我的目录结构设置为 playbooks 目录位于 /var/lib/awx/projects/ 下角色是剧本下的符号链接(symbolic link)。 我需要角色的符号链接(symbolic lin
这是“破解编码面试”一书中的问题: 一个马戏团正在设计一个塔套路,其中的人站在彼此的塔顶上肩膀。出于实用和审美的原因,每个人都必须比他或她下面的人既矮又轻。给定马戏团中每个人的高度和体重,编写一个方法
问候大家, 我最近开始搞乱 Ansible(特别是 Ansible Tower)。 我在我的剧本中使用安全值时遇到了一个问题,更准确地说,我不明白如何正确使用它。 与 Chef-Infra 相比,您可
下面的代码解决了 hanoi 使用预定义函数 moveLOD、swapLOI 和 swapLID 返回 Action 列表的问题。 MoveLOD:将 1 个圆盘从第一个位置移动到三元组第三个位置中的
如您所知,有一些解决汉内塔的方法,但它们要求开始时所有磁盘都在一个塔中。 现在我想知道有什么办法可以解决这个问题,开始时磁盘已经随机分布在塔中。 最佳答案 是的,它仍然是可解的(假设小磁盘之上没有大磁
这是来自 Facebook 招聘样本测试的问题。 有K个钉子。当从钉子的底部到顶部看时,每个钉子可以按半径递减的顺序固定圆盘。有 N 个圆盘,半径为 1 到 N;给定钉子的初始配置和钉子的最终配置,输
尝试通过 REST API 启动工作流程并传递额外变量供剧本使用,但返回的正文显示提供的变量已放入 ignored_fields 部分。 使用 POSTMAN 和 CURL 运行模板都返回相同的结果
在 Git Tower 内部,我存储了大约 26 个文件。但是,当我尝试将存储应用回我的工作树时,我收到有关尾随空格的错误。 我怎样才能成功应用存储,绕过该错误? 完整的错误信息如下: :87: tr
我自己和同事都有相同版本的 Git Tower,当他专注于未提交的更改并点击空格键时,文件会暂存以进行提交。当我按下空格键时,什么也没有发生。那是怎么回事?我喜欢我的热键!空格键会在我的浏览器中选中复
我正在尝试使用此 python 脚本获取/创建 OAuth2 访问 token : import requests import json token_url = 'https://mytower.e
我正在 Tower 服务器中执行以下 POST: http:///api/v2/job_templates/10/launch/ Headers: Content-Type:application/j
我的讲师在测试中向我们提出了以下问题: “给出以下代码: int count=0; static void towersOfhanoi(int n, char source, char target,
我使用 Ansible Vault 来加密存储敏感数据的文件。 在我的编排脚本中,下面提到了运行剧本的命令。 ansible-playbook -i hosts -vvv Playbook.yml -
我理解递归的概念以及它如何与每次调用叠加。但我无法解释当有两个函数调用由 printf 命令分隔时,递归调用如何工作并打印。谁能向我解释一下这个递归调用是如何工作的? 我找到了一个关于名为“Tower
我想知道一种方法或方法来找到手机连接到的小区的位置(GSM one) 这是我的课: package com.example.signal; import java.io.File; import ja
这个问题在这里已经有了答案: Tower of Hanoi: Recursive Algorithm (29 个答案) 关闭 8 年前。 我是 Python 的新手,目前正在学习有关汉诺塔和递归的教
我正在我的 Mac 上试用 Tower 和 Sourcetree GUI,我有两个非常基本的问题: 这些 GUI 是安装 Git 可执行文件还是使用安装在我的 Mac 上的 Git? Git 在我的
我已经在 Mac Finder 中重新组织了我的存储库的文件夹结构,现在当我打开 Git Tower 时,它通知我无法找到这些存储库。我明白这一点,但我正在尝试弄清楚如何从应用程序内部更新存储库的位置
我是一名优秀的程序员,十分优秀!