如何在任意方案中编写程序 性别抑制由整数组成,并返回与之相同的性别表达 原来但所有整数加倍?
答案 0 :(得分:1)
我们想要一个以S表达式作为输入的过程,并输出一个结构相同的S表达式,但每个整数加倍;通常,映射S表达式的过程:
(define (double x) (if (number? x) (* x 2) x))) (define (sexp-map op sexp) ...) (sexp-map double some-sexpression)
我们得到的S表达式(SEXP)将是一个原子,在这种情况下结果是(OP SEXP),或者是一个S表达式列表。在这种情况下,我们可能会考虑在SEXP上映射OP,但是S表达式任意嵌套。我们实际应该做的是映射一个过程,该过程将使用OP转换较小的S表达式中的每个元素。那你看看那个,那只是描述我们目前正在尝试编写的程序目标的另一种方式。因此,我们可以在SEXP上映射SEXP-MAP。
嗯,不,我们实际上不能,因为需要使用两个参数调用SEXP-MAP,而MAP只会给它一个。为了解决这个问题,我们使用了一个参数的辅助程序F:
(define (sexp-map op sexp) (define (f x) (if (list? x) (map f x) (op x))) (f sexp))
F结束所有真正的工作。 SEXP-MAP被简化为一个更容易为程序员使用的外观。
答案 1 :(得分:0)
(define double
(lambda (x)
(cond ((null? x) (list))
((list? (car x)) (cons (double (car x)) (double (cdr x))))
(else (cons (* 2 (car x)) (double (cdr x)))))))
修改强> 修正了这一点感谢Nathan Sanders指出我对嵌套列表的初步监督。
答案 2 :(得分:0)
听起来你想要的是找到s-expression中的每个整数,然后加倍,同时保持其余部分相同。
如果您不知道,s表达式只是可能恰好包含其他列表的列表,并且在级别中处理它们是有意义的。例如,这是一种在s-expression的第一级打印所有值的方法:
(define (print-level-one sexp)
(display (car sexp))
(print-level-one (cdr sexp)))
这将最终调用s表达式的每个部分car
上的显示。
你可以做类似的事情。您需要使用函数integer?
和pair?
来检查某些内容是否为整数,应该加倍,还是另一个列表,应该像顶级列表一样对待。
(注意:由于上面关于家庭作业的评论,我故意模糊不清。如果你只是想要答案,而不是帮助找出答案,请说明,我会改变这一点。)
答案 3 :(得分:0)
An Sexp of numbers is one of
-- Number
-- ListOfSexp
A ListOfSexp is one of
-- empty
-- (cons Sexp ListOfSexp)
因此,您需要一个函数来处理这两个数据定义。由于数据定义相互交叉引用,因此函数将执行相同的操作。每个单独的功能都很直接。
答案 4 :(得分:0)
(define (double E)
(cond ((null? E) '())
((list? (car E)) (cons (double (car E)) (double (cdr E))))
((number? E) (list E))
(else (cons (* 2 (car E)) (double (cdr E))))
))
答案 5 :(得分:0)
(map (lambda (x) (* x 2)) '(1 2 3 4 5)) => '(2 4 6 8 10)
它做什么? (lambda (x) (* x 2))
取一个数字并加倍,map
将该函数应用于列表的每个元素。
编辑:哦,但它不会进入树木。