2009-10-15 2 views
3

я эта проблема, чтобы работать на:Lisp: Как написать функцию высшего порядка

Суммы выше процедура заказа может быть обобщена еще дальше, чтобы захватить идею объединения терминов с фиксированным оператором. Математический оператор продукта является конкретным примером этой идеи, с умножением, заменяющим добавление оператора суммирования. Процедура аккумулирования, начатая ниже, предназначена для захвата этой идеи. Параметр комбайнера представляет собой оператор, который используется для сокращения терминов, а базовый параметр представляет значение, которое возвращается, когда нет оставшихся условий для объединения. Например, если мы уже осуществили процедуру накопиться, то мы могли бы определить порядок сумм, как:

(определить сумму (аккумулировать + 0))

Полное определение скапливаются так, что он ведет себя в соответствии с этим описание.

  (define accumulate 
      (lambda (combiner base) 
       (lambda (term start next stop) 
        (if (> start stop) 
         ... 
         ...)))) 

Я вставил в двух последних строках:

base 
    (combiner base (accumulate (combiner start stop) start next stop)) 

, но я понятия не имею, если это правильно, ни как на самом деле использовать процедуру суммы для вызова аккумулировать и, следовательно, суммировать числа.

+1

Не забудьте пометить свои домашние вопросы «домашней работой» –

+0

@PaulMcMillan: Это не настоящий тег, слава богу! – rvighne

+0

Это было одно в момент, когда я сделал комментарий. Видимо, политика изменилась за прошедшие 5 лет. –

ответ

4

This - отличный способ научиться ловить рыбу. Гораздо лучше , чем дать рыбе.

До тех пор, вот как подойти к проблеме. Напишите функцию , которая будет делать то, что (накапливать + 0). Не используйте функцию накопления; просто напишите defun, который делает то, что спрашивает ваша домашняя работа. Затем напишите функцию, которая будет делать то, что (accumulate * 1) будет делать. Каковы сходства, каковы различия между этими двумя функциями. По большей части они должны быть идентичными, за исключением появления операторов + и *.

Затем обратите внимание, что функция накопления возвращает функцию, которая будет очень похожа на две ранее написанные функции. Теперь, используя представление о том, что две написанные вами функции очень похожи, подумайте, как применить это к функции, которая (defun accumulate ...) должна возвращаться.

Смежные вопросы