Вам нужно компоновать функции, которые вы получаете в параметре f
. Для простоты предположим, что в списке всего две функции - тогда вам нужно применить первую функцию к текущему элементу в списке чисел, а затем применить вторую функцию к результату этого. Если вы можете использовать процедуру compose
, используйте ее и измените эту строку в своем код:
((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?
... с этим:
((compose (cadr f) (car f)) (car l)) ; now we're applying both functions
Если вы не можете использовать compose
, замените ту же строку на эту:
((cadr f) ((car f) (car l))) ; now we're applying both functions
Теперь, если проблема более общая и вам нужно сопоставить список функций с более чем двумя элементами, то еще раз замените ту же строку в вашем коде на эту:
((compose-multi f) (car l))
И реализуйте вспомогательную функцию, которая составляет и возвращает все функции в списке путем последовательных вызовов compose
. Это остается для вас в качестве упражнения, учитывая, что это домашнее задание, но если вы понимаете, как приведенный выше код работает только для двух функций, должно быть достаточно легко расширить результат для списка нескольких функций:
(define (compose-multi flist) ; procedure for composing a list of functions
(if (null? flist) ; if the list is empty then
<???> ; return the identity function
(<???> (compose-multi <???>) ; else compose the result of recursive call
<???>))) ; with the current element in the list
Обратите внимание, что функция идентификации требуется для обработки случая, когда в списке функций нет элементов; его очень просто определить, он просто возвращает то же значение, которое было передано в качестве параметра.
Также имейте в виду, что compose-multi
возвращает функцию, результат составления всех функций в списке — compose
делает это за вас, но если вам не разрешено использовать ее, просто помните, что это:
(compose x y)
... эквивалентно этому:
(lambda (n) (x (y n)))
person
Óscar López
schedule
19.05.2012
square
, а неdouble
, чтобы получить показанный результат?). Вы можете найти ответы на этот вопрос полезными: > stackoverflow.com/questions/9919732/ . - person   schedule 19.05.2012