Немного продолжения по этому вопросу. (* 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)))))))
Вторая процедура для меня значительно быстрее, чем первая.