X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=exercices%2Farithmetic.lsp;h=160645e3840954a726524daacbd51e2339d3c9de;hb=5712270167a05905eed75f7cecb0e49af4225537;hp=85f3f0145e446732be437de2f02cb280541aa8f9;hpb=ada8f303fa63f62209dddeab6f4618f5b73a66b7;p=TD_LISP.git diff --git a/exercices/arithmetic.lsp b/exercices/arithmetic.lsp index 85f3f01..160645e 100755 --- a/exercices/arithmetic.lsp +++ b/exercices/arithmetic.lsp @@ -1,12 +1,32 @@ #!/usr/bin/env newlisp -(define (Puissance P N) +;O(N) +(define (Puissance1 P N) (cond ((= N 0) 1) ((= N 1) P) - ((< N 0) (div 1 (Puissance P (- N)))) - ((* P (Puissance P (- N 1)))))) -(println (Puissance 5 5)) + ((< N 0) (div 1 (Puissance1 P (- N)))) + ((* P (Puissance1 P (- N 1)))))) +(println "Puissance1") +(println (Puissance1 5 5)) +(println (Puissance1 2 12)) + +;(trace true) + +;O(log N) +(define (Puissance2 P N) + (cond + ((= N 1) P) + ((= N 2) (* P P)) + ((> N 2) + (cond + ((= (mod N 2) 0) (Puissance2 (Puissance2 P 2) (/ N 2))) + ((* P (Puissance2 (Puissance2 P 2) (/ (- N 1) 2)))))))) +(println "Puissance2") +(println (Puissance2 5 5)) +(println (Puissance2 2 12)) + +;(trace nil) ; https://fr.wikipedia.org/wiki/Algorithme_d%27Euclide (define (pgcd N P) @@ -15,16 +35,45 @@ ((= N P) N) ((= P 0) N) ((pgcd (- N P) P)))) +(println "PGCD") (println (pgcd 12 4)) (println (pgcd 25 5)) (println (pgcd 21 7)) +;(trace true) + ; https://fr.wikipedia.org/wiki/Coefficient_binomial +; relation de pascal commenté (define (comb N P) (cond ((= P 0) 1) ((= N P) 1) - ((+ (comb (- 1 N) P) (comb (- 1 N) (- 1 P)))))) -;(println (comb 5 4)) + ;((+ (comb (- N 1) P) (comb (- N 1) (- P 1)))))) + ((/ (* N (comb (- N 1) (- P 1))) P)))) +(println "comb") +(println (comb 5 4)) +(println (comb 60 4)) +(println "(comb 12 8) = "(comb 12 8)) + +;(trace nil) +;(trace true) + +(setq L '(3 7 + 4 2 + *)) +(setq M '(4 3 7 + * 2 -)) +(define (calculExp P L) + (cond + ((null? L) P) + ((= (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))) + ((= (first L) '*) (calculExp (cons (* (first P) (P 1)) (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))))) +(println "calculExp") +(println (calculExp '() L)) +;(trace true) +(println (calculExp '() M)) + +;(trace nil) (exit)