方案加倍

时间:2010-02-25 17:19:48

标签: scheme

如何在任意方案中编写程序 性别抑制由整数组成,并返回与之相同的性别表达  原来但所有整数加倍?

6 个答案:

答案 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将该函数应用于列表的每个元素。

编辑:哦,但它不会进入树木。