какой практике программирования следовать, чтобы оценить выражение в схеме - PullRequest
2 голосов
/ 02 июня 2011

Я решаю проблемы с htdp.org. Я хотел бы знать в схеме, которая является лучшей практикой для оценки длинных выражений, имеющих общий оператор, такой как «+» или «*».

Пример:

> (* 1 10 10 2 4)                 ; Version A
> (* 1 (* 10 (* 10 (* 2 4))))     ; Version B

Должен ли я следовать A или B. Также, пожалуйста, рассмотрите приведенный выше пример для алгебраических выражений, таких как площадь поверхности цилиндра.

-Abhi

Ответы [ 2 ]

8 голосов
/ 02 июня 2011

Реальный вопрос должен быть, они дают разные результаты? Давайте попробуем в нашем REPL:

>> (* 1 10 10 2 4)
800
>> (* 1 (* 10 (* 10 (* 2 4))))
800
>> 

Поскольку они, по сути, одинаковы (на вашем примере), я бы предпочел пойти с меньшим количеством церемоний / шума в коде. Используйте первый.

1 голос
/ 14 июня 2011

Немного продолжения по этому вопросу. (* a b c ...) не обязательно эквивалентно (* (* a b) ...), когда вы говорите о времени.

Некоторые реализации могут распознавать обычную операцию, но попробуйте синхронизировать эти два определения факториала:

(define (f1 n)
  (let loop ((up 2)
             (down n)
             (a 1))
    (cond ((> up down) a)
          ((= up down) (* a up))
          (else
           (loop (+ 1 up) (- 1 down)
                 (* a up down))))))

(define (f2 n)
  (let loop ((up 2)
             (down n)
             (a 1))
    (cond ((> up down) a)
          ((= up down) (* a up))
          (else
           (loop (+ 1 up) (- 1 down)
                 (* a (* up down)))))))

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

...