- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很难理解 The Little Schemer 的 evens-only*&co
发生了什么事情第 145 页的示例。
这是代码:
(define evens-only*&co
(lambda (l col)
(cond
((null? l)
(col '() 1 0))
((atom? (car l))
(cond
((even? (car l))
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col (cons (car l) newl)
(opx (car l) product)
sum))))
(else
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col newl product (op+ (car l) sum)))))))
(else
(evens-only*&co (car l)
(lambda (newl product sum)
(evens-only*&co (cdr l)
(lambda (dnewl dproduct dsum)
(col (cons newl dnewl)
(opx product dproduct)
(op+ sum dsum))))))))))
col
可:
(define evens-results
(lambda (newl product sum)
(cons sum (cons product newl))))
l
如
'((1) 2 3)
,它立即进入最终
else
与
(car l)
如
(1)
和
(cdr l)
如
(2 3)
.很好,但我的大脑一片空白,试图理清
dnewl
,
dproduct
,
dsum
来自
newl
,
product
,
sum
.如果有人可以指导我如何设置 DrRacket 或 Chez Scheme 或 MIT-Scheme 来运行步进器,那也会很有帮助。
最佳答案
我发现这部分在第一次阅读时也很困惑,直到我在其他地方阅读了关于延续和延续传递风格(这就是什么)之后才开始理解它。
冒着解释你已经得到的东西的风险,一种对我有帮助的看待它的方式是将“收集器”或“延续”视为替代函数返回值的正常方式。在正常的编程风格中,你调用一个函数,接收一个值,然后在调用者中用它做一些事情。例如,标准递归 length
函数包含表达式 (+ 1 (length (cdr list)))
对于非空情况。这意味着一旦 (length (cdr list))
返回一个值,无论它产生什么值,都会有一个计算等待发生,我们可以将其视为 (+ 1 [returned value])
.在正常的编程中,解释器会跟踪这些待处理的计算,这些计算往往会“叠加”,正如您在本书的前几章中看到的那样。例如,在递归计算列表的长度时,我们有一个“等待计算”的嵌套,与列表的长度一样深。
在延续传递风格中,我们不是调用函数并在调用函数中使用返回的结果,而是通过向函数提供要调用的“延续”来告诉函数在产生其值时要做什么。 (这类似于您在异步 Javascript 编程中对回调所做的处理,例如:不是编写 result = someFunction();
,而是编写 someFunction(function (result) { ... })
,并且所有使用 result
的代码都在回调函数中)。
这是length
以连续传递风格,仅供比较。我已经调用了延续参数 return
,这应该表明它在这里是如何工作的,但请记住,它只是一个普通的 Scheme 变量,就像其他任何变量一样。 (在这种风格中,延续参数通常称为 k
)。
(define (length/k lis return)
(cond ((null? lis) (return 0))
(else
(length/k (cdr lis)
(lambda (cdr-len)
(return (+ cdr-len 1)))))))
else
上面的条款说:
imagine you have the result of calling
length/k
on(cdr lis)
, and call itcdr-len
, then add one and pass the result of this addition to your continuation (return
).
(+ 1 (length (cdr lis)))
时必须做的事情。在函数的正常版本中(除了它不必为中间结果命名
(length (cdr lis))
。通过传递延续或回调,我们使控制流(和中间值的名称)显式,而不是让解释器跟踪它。
evens-only*&co
中的每个子句.由于此函数生成三个值而不是一个值,因此这里稍微有点复杂:删除了奇数的嵌套列表;偶数的乘积;和奇数之和。这是第一个子句,其中
(car l)
已知为偶数:
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col (cons (car l) newl)
(opx (car l) product)
sum)))
Imagine that you have the results of removing odd numbers, multiplying evens, and adding odd numbers from the
cdr
of the list, and call themnewl
,product
, andsum
respectively.cons
the head of the list ontonewl
(since it's an even number, it should go in the result); multiplyproduct
by the head of the list (since we're calculating product of evens); leavesum
alone; and pass these three values to your waiting continuationcol
.
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col newl product (op+ (car l) sum))))
newl
和
product
到延续(即“返回”它们),以及
sum
的总和和列表的头部,因为我们正在总结奇数。
(car l)
是一个嵌套列表,并且由于双递归而稍微复杂:
(evens-only*&co (car l)
(lambda (newl product sum)
(evens-only*&co (cdr l)
(lambda (dnewl dproduct dsum)
(col (cons newl dnewl)
(opx product dproduct)
(op+ sum dsum))))))
Imagine you have the results from removing, summing and adding the numbers in
(car l)
and call thesenewl
,product
, andsum
; then imagine you have the results from doing the same thing to(cdr l)
, and call themdnewl
,dproduct
anddsum
. To your waiting continuation, give the values produced bycons
ingnewl
anddnewl
(since we're producing a list of lists); multiplying togetherproduct
anddproduct
; and addingsum
anddsum
.
l
,以及返回继续 -
col
,换句话说,您可以将我们在递归过程中建立的延续链视为对更常规编写的函数的“调用堆栈”进行建模!
关于recursion - The Little Schemer Evens-only*&co,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692449/
我正在阅读 jQuery API,关于偶数选择器,jQuery 建议我们使用纯 CSS 选择器选择元素列表,然后使用 filter(":even") 以获得更好的性能。但我认为 jQuery 也针对其
jquery 中的 :nth-child(even) 和 :even 看起来很相似,但选择的元素不同。请让我知道其中的差异。 快乐编码... 最佳答案 下面是一个例子来说明差异: http://jsf
query("SELECT id, look, username, motto FROM users WHERE rank = '7'"); if($query->num_rows > 0):
我在序言中有以下奇数和偶数生成器 even(0). even(X) :- odd(Y), X is Y+1, X>0. odd(1). odd(X) :- even(Y), X is Y+1, X>1
我的问题对你来说可能听起来不同。 我是初学者,正在学习有限自动机。我正在通过互联网搜索 下面给定机器的有限自动机的正则表达式。 谁能帮我写上面机器的“有限自动机的正则表达式” 任何帮助将不胜感激 最佳
jQuery 选择 first row 作为 even (基于 0)而 CSS 选择 second row 作为 even (1基于)。是的,jQuery documentation在它的附加说明中明
PLFA 练习:如果我们在量词章节 (https://plfa.github.io/Quantifiers/) 中更“自然地”编写算术会怎样? ∃-even′ : ∀ {n : ℕ} → ∃[ m ]
面试中被问到的问题: 给定一个数组。任务是排列数组: 奇数元素占据奇数位置,偶数元素占据偶数位置。 - 元素的顺序必须保持不变。 考虑从零开始的索引。 按条件打印后,若有剩余,则原样打印剩余元素。 例
首先,抱歉英语不是我的第一语言。 *(偶数和奇数是根据索引) 我想在移动 View 中实现此表。 我尝试过的 Content 1 Head Content 2
我在my.cnf中添加了如下内容 [mysqld] max_allowed_packet=32M [mysql] max_allowed_packet=32M 而且我还在 JDBC 查询中添加了以下内
我继承了一些遗留代码,可以旋转三角形之间的边以改进拓扑分布,该算法运行良好,但计算量很大。 给定由共享一条边的两个三角形组成的四边形的伪代码是: /* split 0-2 */ score_02 =
GitHub 网络界面有一个很好的功能,可以告诉我一个分支是否与 master 分支一致。 是否有与此功能等效的命令行?我使用多个存储库,我正在寻找一种快速方法来查看分支是否均匀或需要注意。 这里是
抱歉标题太可怕了,我真的很难为我正在寻找的东西找到合适的词。我认为我想做的其实很简单,但我仍然无法真正专注于创建算法。我敢打赌,如果我不缺乏算法术语的基本知识,我可以很容易地在网上找到解决方案。 假设
我们在类里面学习数组,我被分配了这个编程项目。到目前为止,我已经编写了下面的代码,但我对如何让它正常工作感到困惑。我应该为我的代码使用带有 System.out.println 语句的 for 循环。
我正在使用 jQuery 来检查元素是奇还是偶: $("#map183").parent().is(':even'); 这将返回true或false,具体取决于元素所在的位置。 但是这总是返回 fa
我需要在 Google AppEngine(或者您可以想到任何其他哈希表)中将一堆实体存储在我需要根据顺序输入自行创建的键下。 举个例子,假设我只处理长度为一位十进制数字的键。然后我需要为键“0”存储
我试图从我的表中获取一些记录,其中 is_active = 1,但我的查询返回结果甚至是记录的 is_active = 0。我确定这是我的查询错误。 这是我的查询 SELECT `id`, `post
所以我的教授决定变聪明,为我的扑克项目设计了一手名为 EVEN STRAIGHT 的牌。这就像顺子,只是牌必须是连续的偶数。例如- 8,6,2,4,10 是偶数顺子。此外,一张 A(值为 1)可以用作
我正在编写代码,根据玩家的得分 (puntajes) 创建两个“偶数团队”。 该算法遍历球员数组并比较每个球员的得分以获得最小差异,然后将球员分为两个数组,每队一个。 这是我的代码: if (list
我试图隐藏一个不属于我的类的实现。我想通过扩展类并实现自己的接口(interface)来做到这一点。以下是我需要的类的实例是如何创建的: QueueInfo info = admin.getQueue
我是一名优秀的程序员,十分优秀!