我是一名计划新手,并试图理解我的作业。 我之前做过一个名为重复的函数,它看起来像这样:
( DEFINE ( duplicate lis )
(IF (NULL? lis) '())
((CONS (CAR lis) (CONS (CAR lis) (duplicate (CDR lis))))
))
这样的典型i / o将是i :(复制'(1 2 3 4))o:(1 1 2 2 3 3 4 4),所以基本上它复制了列表中的所有内容。 继续: 现在我应该创建一个名为 comp 的函数。 它应该像这样构建:
(DEFINE (comp f g) (lambda (x) (f (g (x))))
我可以输入'(1 2 3 4)并返回(1 1 4 4 9 9 16 16)
所以f = 重复和g = lambda 。 我知道 lambda 应该是这样的:
(lambda (x) (* x x))
但问题出现在这里,我已经花了几个小时,你可以看到没有取得多大进展。
任何帮助将不胜感激。 最好的问候。
答案 0 :(得分:2)
使用map
:
> (map (lambda (x) (* x x)) (duplicate '(1 2 3 4)))
=> (1 1 4 4 9 9 16 16)
或修改duplicate
以将过程作为其第二个参数并将其应用于列表的每个元素:
(define (duplicate lst p)
(if (null? lst) ()
(append (list (p (car lst)) (p (car lst))) (duplicate (cdr lst) p))))
> (duplicate '(1 2 3 4) (lambda (x) (* x x)))
=> (1 1 4 4 9 9 16 16)
答案 1 :(得分:0)
一种方法如下:
(define (comp f g) (lambda (x) (f (g x))))
(define (square x) (* x x))
(define (dup x) (list x x))
(define (duplicate-square lst)
(foldr append '() (map (comp dup square) lst)))
现在在repl处,执行:
> (duplicate-square '(1 2 3 4))
'(1 1 4 4 9 9 16 16)