LINUX.ORG.RU

интерпретаторы scheme и факториал


0

0

Когда-то давно здесь была тема про вычисление ! на 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 и направить его туда?

Что-то странное ты хочешь... Меряться скоростью _интерпретаторов_? 8\

Присвой значение переменной - вывода самого значения не будет.

yyk ★★★★★
()

На этих языках кроме факториала и чисел Фибоначчи ещё что-нибудь пишут?

anonymous
()
Ответ на: комментарий от yyk

А что в этом странного? Мне важнее узнать, что интерпретатор всё таки вычисляет !131072, а не отделывается +inf. Ну а время выполнения просто для примерной оценки.

undet
() автор топика

У меня 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 не показывает :)

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

упс, я ошибся... как раз +inf то оно и показывает, чтобы его увидеть просто надо было (display ) использовать...

Cy6erBr4in ★★★
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от undet

> А что в этом странного?

именно в упоре на "интерпретацию", ибо 1) есть и компиляторы, 2) (у CL - точно, у схемы - не уверен) есть "компилирующие интерпретаторы", т.е. один фиг сначала откомпилируют введённое выражение, а потом выполнят.

P.S. Я просто к слову придрался, если заменить "интерпретаторы" на "реализации" - все претензии снимаются :)

P.P.S Kawa: 34797 ms

P.P.P.S. А ошибка может быть из-за вывода, ибо длинна выводимой строки получается 613842

yyk ★★★★★
()
Ответ на: комментарий от yyk

> Я просто к слову придрался, если заменить "интерпретаторы" на "реализации" - все претензии снимаются :)

Согласен, я неточно написал

> А ошибка может быть из-за вывода, ибо длинна выводимой строки получается 613842

Да, именно такой длины строка и получается. А что за ошибка?

undet
() автор топика

> И ещё: можно ли как-нибудь попроще избавиться от вывода ! кроме как открыть /dev/null и направить его туда?

(time (begin (! 42000000) #t))

stassats ★★★★
()
Ответ на: комментарий от undet

> Да, именно такой длины строка и получается. А что за ошибка?

просто предположение. создай тестовую строку такой длинны и попробуй её вывести. если выведется - значит я был не прав.

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.