Проблема схемы (использование функции в качестве параметра) - PullRequest
1 голос
/ 15 ноября 2010

Я новичок в Схеме и пытаюсь разобраться в моей домашней работе.У меня есть функция, которую я сделал ранее, под названием duplicate , и она выглядит следующим образом:

( DEFINE ( duplicate lis )
          (IF (NULL? lis) '())
          ((CONS (CAR lis) (CONS (CAR lis) (duplicate (CDR lis))))
         ))

Типичным вводом-выводом будет i: (duplicate '(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 (x) (* x x))

Но вот здесь начинается проблема, я уже потратил на это несколько часов, и, как вы видите, не достиг большого прогресса.

Любая помощь будет оценена.С наилучшими пожеланиями.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Используйте 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)
0 голосов
/ 15 ноября 2010

Один из способов сделать это следующим образом:

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

Теперь в ответе выполните:

> (duplicate-square '(1 2 3 4))
'(1 1 4 4 9 9 16 16)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...