方案问题(使用函数作为参数)

时间:2010-11-15 10:37:06

标签: scheme

我是一名计划新手,并试图理解我的作业。 我之前做过一个名为重复的函数,它看起来像这样:

( 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))

但问题出现在这里,我已经花了几个小时,你可以看到没有取得多大进展。

任何帮助将不胜感激。 最好的问候。

2 个答案:

答案 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)