Когда-то давно здесь была тема про вычисление ! на scheme, и там
кто-то пожаловался на chicken scheme, который не вычислял !16384, а
выводил +inf. Предлагаю запустить следующий код на своём
интерпретаторе и поделится результатами (само число, пожалуй,
приводить не надо :), достаточно просто убедиться, что оно не +inf, и
привести время выполнения). У меня gambit 4.2.8:
> (define !
(lambda (n)
(letrec ((iteration
(lambda (l h)
(if (= l h)
l
(let ((m (floor (/ (+ l h) 2))))
(* (iteration l m)
(iteration (+ m 1) h)))))))
(cond ((not (integer? n))
(error "! -- n should be an integer"))
((< n 1)
(error "! -- n should be greater or equal to 1"))
(else (iteration 1 n))))))
> (call-with-output-file "/dev/null"
(lambda (port) (write (time (! 131072)) port)))
(time (! 131072))
2475 ms real time
2250 ms cpu time (2172 user, 78 system)
300 collections accounting for 217 ms real time (188 user, 8 system)
148454472 bytes allocated
15379 minor faults
no major faults
И ещё: можно ли как-нибудь попроще избавиться от вывода ! кроме
как открыть /dev/null и направить его туда?
А что в этом странного? Мне важнее узнать, что интерпретатор всё таки вычисляет !131072, а не отделывается +inf. Ну а время выполнения просто для примерной оценки.
У меня chicken из репозитория debian lenny...
вот какие результыта выдаёт на твоём коде:
0.04 seconds elapsed
0 seconds in (major) GC
0 mutations
123 minor GCs
1 major GCs
0.04 seconds elapsed
0 seconds in (major) GC
0 mutations
247 minor GCs
1 major GCs
вот мой код:
(define (! n)
(define (fac n acc)
(if (zero? n)
acc
(fac (- n 1) (* acc n))))
(fac n 1))
(time (! 131072))
вот его результат:
0.028 seconds elapsed
0 seconds in (major) GC
0 mutations
48 minor GCs
0 major GCs
уж не знаю, полезно ли будет это для тебя :) +inf не показывает :)
я на прошлых выходных базу данных написал, которая может выполнять (и делает это весьма хорошо) аццке сложные запросы. так что давай без снобизма, мой анонимный брат
именно в упоре на "интерпретацию", ибо 1) есть и компиляторы, 2) (у CL - точно, у схемы - не уверен) есть "компилирующие интерпретаторы", т.е. один фиг сначала откомпилируют введённое выражение, а потом выполнят.
P.S. Я просто к слову придрался, если заменить "интерпретаторы" на "реализации" - все претензии снимаются :)
P.P.S Kawa: 34797 ms
P.P.P.S. А ошибка может быть из-за вывода, ибо длинна выводимой строки получается 613842