- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想统计磁盘的移动次数。但结果我得到了别的东西。
(setq x 0)
(defun towersOfHanoi (n from to help)
(if (> n 0)
;progn evaluates multiple forms and returns the result from the last one.*/
(progn
(towersOfHanoi (- n 1) from help to)
(format t "~d ----> ~d~%" from to)
(towersOfHanoi (- n 1) help to from)
(+ 1 x)
)
))
;(towersOfHanoi 3 'A 'B 'C)
当我运行它时,我得到了
(towersOfHanoi 3 'A 'B 'C)
A ----> B
A ----> C
B ----> C
A ----> B
C ----> A
C ----> B
A ----> B
1
为什么它是 1 而不是 7,我想每次递归调用都会将 x 的值重置为 0 但是,我如何才能获得磁盘的移动次数。谢谢。
最佳答案
在 lisp 中,if
最多接受三个参数;条件,当条件为真时评估的形式,以及当条件为假时评估的形式。
Selenium http://www.lispworks.com/documentation/HyperSpec/Body/s_if.htm了解详情。
为了在一个分支中评估多个表单,您可以使用 progn
评估多个表单并返回最后一个表单的结果。
此外,princ
期望只打印一个参数。为了一次打印几样东西,你可以使用format
在你的情况下(还要注意括号的位置):
(defun towersOfHanoi (n from to help)
(if (> n 0)
(progn
(towersOfHanoi (1- n) from to help)
(format t "~d ----> ~d~%" from to)
(towersOfHanoi (1- n) help to from))))
没有 false 分支,你也可以使用 when
可以评估不止一种形式:
(defun towersOfHanoi (n from to help)
(when (> n 0)
(towersOfHanoi (1- n) from to help)
(format t "~d ----> ~d~%" from to)
(towersOfHanoi (1- n) help to from)))
为了对移动进行计数,您可以使用一个本地计数变量(由 let
引入)和一个更新此变量的内部工作函数(由 labels
引入)变量:
(defun towers-of-hanoi (n &optional (from 1) (to 2) (help 3))
(let ((counter 0)) ; local variable
(labels ((towers-of-hanoi-core (n from to help) ; local function
(when (> n 0)
(towers-of-hanoi-core (1- n) from to help)
(incf counter)
(format t "~d ----> ~d~%" from to)
(towers-of-hanoi-core (1- n) help to from))))
(towers-of-hanoi-core n from to help)) ; leave work to inner function
(format t "Moves: ~d ~%" counter)))
在这里,from、to 和 help 也是可选的,默认为 1、2 和 3。
同样:细节可以在 Hyperspec 中找到:http://www.lispworks.com/documentation/HyperSpec/Front/
关于recursion - 计算在 Towers of hanoi Lisp 中移动的磁盘数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14423472/
? 1 2
下面的代码解决了 hanoi 使用预定义函数 moveLOD、swapLOI 和 swapLID 返回 Action 列表的问题。 MoveLOD:将 1 个圆盘从第一个位置移动到三元组第三个位置中的
这个问题在这里已经有了答案: Tower of Hanoi: Recursive Algorithm (29 个答案) 关闭 6 年前。 我有以下汉诺塔的工作程序,我们将从 A--B 塔移动磁盘,C
如您所知,有一些解决汉内塔的方法,但它们要求开始时所有磁盘都在一个塔中。 现在我想知道有什么办法可以解决这个问题,开始时磁盘已经随机分布在塔中。 最佳答案 是的,它仍然是可解的(假设小磁盘之上没有大磁
这是来自 Facebook 招聘样本测试的问题。 有K个钉子。当从钉子的底部到顶部看时,每个钉子可以按半径递减的顺序固定圆盘。有 N 个圆盘,半径为 1 到 N;给定钉子的初始配置和钉子的最终配置,输
我的讲师在测试中向我们提出了以下问题: “给出以下代码: int count=0; static void towersOfhanoi(int n, char source, char target,
我理解递归的概念以及它如何与每次调用叠加。但我无法解释当有两个函数调用由 printf 命令分隔时,递归调用如何工作并打印。谁能向我解释一下这个递归调用是如何工作的? 我找到了一个关于名为“Tower
我正在尝试使用堆栈解决汉诺塔问题。这是我的代码: Init_stack = [0,1,2,3] Buffer_stack = [] Final_stack = [] n = len(Init_stac
这个问题在这里已经有了答案: Tower of Hanoi: Recursive Algorithm (29 个答案) 关闭 8 年前。 我是 Python 的新手,目前正在学习有关汉诺塔和递归的教
锁定。这个问题及其答案是 locked,因为这个问题离题但具有历史意义。它目前不接受新的答案或交互。 规则 汉诺塔是一个谜,如果你不是很熟悉它,这里是它的工作原理: 游戏场由 3 根杆和 x 个圆盘组
我正在实现汉诺塔问题以更多地了解递归。我能够使用 3 peg 的情况来实现它,但是,当我想使用更多的 peg(以产生更少的移动)时,我理解 Frame-Stewart 解决方案,我必须打破我拥有的磁盘
我想统计磁盘的移动次数。但结果我得到了别的东西。 (setq x 0) (defun towersOfHanoi (n from to help) (if (> n 0) ;progn ev
我正在学习 C++ 中的递归,但被以下用于解决汉诺塔问题的 C++ 代码难住了。 void Hanoi(int m, string start, string middle, string end){
这个问题在这里已经有了答案: How does recursive algorithm work for Towers of Hanoi? (2 个答案) 关闭 8 年前。 目前,我正在阅读道格拉斯
我正在尝试实现 Towers of Hanoi .我还没有在我的递归调用之间打印出任何东西,但我一直收到错误提示 '('(LIST) 'NIL 'NIL) should be a lambda exp
我是一名优秀的程序员,十分优秀!