Scheme 双入方案

Scheme 双入方案,scheme,Scheme,如何在scheme中编写具有任意 由整数组成的sexpression,返回与相同的sexpression 原始的但所有整数都加倍了 (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)))))))

如何在scheme中编写具有任意 由整数组成的sexpression,返回与相同的sexpression 原始的但所有整数都加倍了

(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指出我最初对嵌套列表的疏忽

编辑
解决了这个问题。感谢Nathan Sanders指出我最初对嵌套列表的疏忽。

听起来你想要的是在s表达式中找到每个整数,然后将其加倍,同时保持其余整数不变

如果您不知道,s表达式只是碰巧包含其他列表的列表,在级别中处理它们是有意义的。例如,这里有一种打印s表达式级别1上所有值的方法:

(define (print-level-one sexp)
  (display (car sexp))
  (print-level-one (cdr sexp)))
这将最终调用s表达式每个部分的
car
上的显示

你也可以做类似的事情。您需要使用函数
integer?
pair?
来检查某个内容是整数(应该加倍),还是另一个列表(应该像顶级列表一样处理)


(注意:由于上面关于家庭作业的评论,我故意含糊其辞。如果你只是想要答案,而不是帮助你找出答案,那么就这么说,我会改变这个。)

听起来你想要的是在s表达式中找到每个整数,然后将其加倍,同时保持其余部分不变

如果您不知道,s表达式只是碰巧包含其他列表的列表,在级别中处理它们是有意义的。例如,这里有一种打印s表达式级别1上所有值的方法:

(define (print-level-one sexp)
  (display (car sexp))
  (print-level-one (cdr sexp)))
这将最终调用s表达式每个部分的
car
上的显示

你也可以做类似的事情。您需要使用函数
integer?
pair?
来检查某个内容是整数(应该加倍),还是另一个列表(应该像顶级列表一样处理)

(注意:由于上面关于家庭作业的评论,我故意含糊其辞。如果你只是想要答案,而不是帮助你找出答案,那么就说出来,我会改变这个。)

因此,您需要一个函数来处理这两个数据定义。由于数据定义相互交叉引用,因此函数将执行相同的操作。每个函数都非常简单

(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))))
        ))
因此,您需要一个函数来处理这两个数据定义。由于数据定义相互交叉引用,因此函数将执行相同的操作。每个函数都非常简单

(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))))
        ))
它有什么作用
(lambda(x)(*x2))
获取一个数字并将其加倍,然后
map
将该函数应用于列表中的每个元素

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

它有什么作用
(lambda(x)(*x2))
获取一个数字并将其加倍,然后
map
将该函数应用于列表中的每个元素


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

我们需要一个过程,该过程以一个S表达式作为输入,并输出一个具有相同结构的S表达式,但每个整数都是两倍的;通常,映射S表达式的过程:

(define (double x) (if (number? x) (* x 2) x))) (define (sexp-map op sexp) ...) (sexp-map double some-sexpression) (定义(双x) (如有)(编号?x) (*x2) x) )) (定义(sexp映射op sexp) ...) (sexp映射加倍一些sexpression) 我们得到的S表达式(SEXP)将是一个原子,在这种情况下,结果是(OP SEXP),或者是一个S表达式列表。在这种情况下,我们可能会考虑将OP映射到SEXP,但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)) (定义(sexp映射op sexp) (定义(f x) (如果(列表?x) (地图f x) (作品十) (f性别问题)
F最终完成了所有真正的工作。SEXP-MAP被简化为程序员更容易使用的外观

我们需要一个过程,它以一个S表达式作为输入,输出一个具有相同结构的S表达式,但每个整数都是两倍的;通常,映射S表达式的过程:

(define (double x) (if (number? x) (* x 2) x))) (define (sexp-map op sexp) ...) (sexp-map double some-sexpression) (定义(双x) (如有)(编号?x) (*x2) x) )) (定义(sexp映射op sexp) ...) (sexp映射加倍一些sexpression) 我们得到的S表达式(SEXP)将是一个原子,在这种情况下,结果是(OP SEXP),或者是一个S表达式列表。在这种情况下,我们可能会考虑将OP映射到SEXP,但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)) (定义(sexp映射op sexp) (定义(f x) (如果(列表?x) (地图f x) (作品十) (f性别问题)
F最终完成了所有真正的工作。SEXP-MAP被简化为程序员更容易使用的外观

这听起来很像家庭作业,在这种情况下,你应该加上“家庭作业”标签。因为你所有的问题都是在过去的10天里提出的,关于你家庭作业中的“如何做”,我推荐Friedman和Felleison的《小阴谋家》。在读完一两章之后,像这样的问题将是轻而易举的事(而且你不必担心)