On 2010-10-01 16:47:02 -0400, BartC said:

I had a quick look at Lisp to see if your claims had any basis. I tried this program:

(defun fib (n)
   (if (< n 2)
       n
       (+ n (fib (- n 1)) (fib (- n 2)) )
))

But it gave the wrong results and it took ages to figure out why. Even after downloading a working version for comparison, it's was difficult to spot the extraneous 'n' (I think I was concentrating on getting the round brackets all in the right places).

I saw it immediately, but I'm familiar with lisp and you are not - those two parentheses (what you call "round brackets") on a line by themselves are a dead giveaway.


I thought you were saying that Lisp (and dynamic typing in general) was better for pointing out errors? The above error in C would have been picked up more easily I think (due to less parentheses clutter, and more obvious separators between terms).

As for speed, executing fib(38) took about 60 seconds on my machine (gnu clisp with no switches set). (Compared with 3.5 seconds, for my own interpreted, dynamic language, and 0.6 seconds for C.)

Compiled lisp is fast, but you need to actually compile it:

CL-USER 96 > (defun fib (n)
            (declare (optimize speed (debug 0)))
            (if (< n 2)
              n
              (+ (fib (- n 1)) (fib (- n 2)))))
FIB

CL-USER 97 > (compile 'fib)
FIB
NIL
NIL

CL-USER 98 > (time (fib 38))
Timing the evaluation of (FIB 38)

User time    =        0.888
System time  =        0.002
Elapsed time =        0.877
Allocation   = 142568 bytes
0 Page faults
39088169

which is in the same range as your .6 seconds for your equivalent c program.

What happens when you want fib(1000) or fib(1000000)? Then the naive recursive version isn't very useful (it's just too slow), and the result is going to overflow c integer types.

in lisp:

CL-USER 118 > (defun fact (n) (if (zerop n) 1 (* n (fact (1- n)))))
FACT

CL-USER 119 > (defun fib (n)
               (/ (loop for k from 1 to n by 2
                        sum (/ (* (expt 5 (/ (1- k) 2)) (fact n))
                               (fact k) (fact (- n k))))
                  (expt 2 (1- n))))
FIB

CL-USER 120 > (compile 'fact)
FACT
NIL
NIL

CL-USER 121 > (compile 'fib)
FIB
NIL
NIL

CL-USER 122 > (time (fib 1000))
Timing the evaluation of (FIB 1000)

User time    =        0.760
System time  =        0.007
Elapsed time =        0.748
Allocation   = 474522008 bytes
147 Page faults
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875

warmest
regards,

Ralph

--
Raffael Cavallaro

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to