X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=exercices%2Farithmetic.lsp;h=0d55480f69eb758f476ebd94033c8dcf0a8612ad;hb=a54a070c1c0a6e5dfdf7f45b62c01aee6b9f0212;hp=4bfa94f319b2d8fa207a1a01af672a33da8a2123;hpb=dc802a3ec00113c0b214f2e0c716291450c0caa4;p=TD_LISP.git diff --git a/exercices/arithmetic.lsp b/exercices/arithmetic.lsp index 4bfa94f..0d55480 100755 --- a/exercices/arithmetic.lsp +++ b/exercices/arithmetic.lsp @@ -63,13 +63,14 @@ (setq N '(10 10 5 / +)) (define (calculExp P L) (cond - ((null? L) P) - ((= (first L) '+) (calculExp (cons (+ (first P) (P 1)) (rest (rest P))) (rest L))) + ((null? L) (first P)) + ; all these conditions could probably be simplified + ((= (first L) '+) (calculExp (cons (+ (P 1) (first P)) (rest (rest P))) (rest L))) ((= (first L) '-) (calculExp (cons (- (P 1) (first P)) (rest (rest P))) (rest L))) - ((= (first L) '*) (calculExp (cons (* (first P) (P 1)) (rest (rest P))) (rest L))) + ((= (first L) '*) (calculExp (cons (* (P 1) (first P)) (rest (rest P))) (rest L))) ;FIXME: test for divide by zero ((= (first L) '/) (calculExp (cons (/ (P 1) (first P)) (rest (rest P))) (rest L))) - ((calculExp (cons (first L) P) (rest L))))) + ((number? (first L)) (calculExp (cons (first L) P) (rest L))))) (println "calculExp") (println (calculExp '() L)) ;(trace true) @@ -82,7 +83,11 @@ (define (algsimplificator L) (cond ((null? L) '()) + ; I'm having hard time to find a way of escaping the '(' and ')' characters ((= (first L) ) (rest L)) + ;here is the idea: detect the lower well formed expression: begin with (op and finish with ) where op = + - * / and have only two parameters that are atoms. + ;then if it match a know pattern, simplify it by following the matching rule. + ;do it again on the upper layer recursively until we only have (op A B) that just match no known simplication rules. )) (println "algsimplificator") @@ -104,12 +109,26 @@ (define (fibo:fibo n) (if (not fibo:mem) (set 'fibo:mem '(0 1))) (dotimes (i (- n 1)) + ;this create a LIFO (or stack) of all previous fibonnaci serie result values (push (+ (fibo:mem -1) (fibo:mem -2)) fibo:mem -1)) (last fibo:mem)) (println "fibo") (println (fibo 20)) (println (time (fibo 20))) +;(trace nil) +;(trace true) + +(setq S '()) +(define (Somme3ou5 N) + (dolist (i (sequence 0 N)) + (cond + ((= (mod i 3) 0) (setq S (cons i S))) + ((= (mod i 5) 0) (setq S (cons i S))))) + (apply + S)) +(println "Somme3ou5") +(println (Somme3ou5 100)) + ;(trace nil) (exit)