* Fix aplatir function
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 2 May 2017 11:37:30 +0000 (13:37 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 2 May 2017 11:37:30 +0000 (13:37 +0200)
 * Implement filtre with recursion
 * Fix C n p function

Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
exercices/arithmetic.lsp
exercices/lists.lsp

index 85f3f0145e446732be437de2f02cb280541aa8f9..a3f27ce90d7c99e6e7ca71575b0b7a16d336c6b0 100755 (executable)
@@ -1,12 +1,30 @@
 #!/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))
+
+;(trace true)
+
+;O(log N)
+(define (Puissance2 P N)
+  (cond
+    ((= N 0) 1)
+    ((= N 1) P)
+    ((> N 1)
+     (cond
+       ((= (mod N 2) 0) (Puissance2 (Puissance2 P 2) (/ N 2)))
+       ((* P (Puissance2 (Puissance2 P 2) (/ (- 1 N) 2))))))))
+(println "Puissance2")
+;(println (Puissance2 5 5))
+
+;(trace nil)
 
 ; https://fr.wikipedia.org/wiki/Algorithme_d%27Euclide
 (define (pgcd N P) 
     ((= 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
 (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))))))
+(println "comb")
+(println (comb 5 4))
+(println (comb 60 4))
+
+;(trace nil)
+
+(setq L '(3 7 + 4 2 + *))
+(setq P '())
+(define (calculExp P L)
+  (cond
+    ((null? L) 0)
+    ((= (first L) '+) (+ (first P) (calculExp (rest P) (rest L)))) 
+    ((= (first L) '-) (- (first P) (calculExp (rest P) (rest L))))
+    ((= (first L) '*) (* (first P) (calculExp (rest P) (rest L))))
+    ;FIXME: test for divide by zero
+    ((= (first L) '/) (/ (first P) (calculExp (rest P) (rest L))))
+    ((cons (first L) (calculExp P (rest L))))))    
+;(println (calculExp P L))
 
 (exit)
index e97d74796833b3869973bd155c33bb1b69a650d4..6bf12a5e7a1e1803016fd4b6bc1e3d03b33b8c1a 100755 (executable)
 
 (define (aplatir L) 
   (cond
-    ((null? L) nil)
-    ((atom? L) (list L)) ;FIXME: the "casting" is not working properly
+    ((null? L) '())
+    ((atom? L) (list L))
     ((append (aplatir (first L)) (aplatir (rest L))))))
 (println "aplatir/flat")
-;(println (aplatir T))
+(println (aplatir T))
 (println (flat T))
 
 ;(trace nil)
     ((and (inclu L1 L2) (inclu L2 L1) true))))
 (println "filtre")
 (println (filtre L1 L2 ?))
+(println (filtre L M ?))
+
+;algorithm written on the board
+(define (filtrerec L1 L2 C)
+  ;FIXME: use the function argument C
+  (cond
+    ((null? L1)
+      (cond
+        ((null? L2) true)
+        ((= '? (first L2)) (filtrerec L1 (rest L2)))
+        (nil)))
+    ((null? L2) (filtrerec L2 L1))
+    ((= '? (first L1)) (filtrerec (rest L1) L2))
+    ((= '? (first L2)) (filtrerec L1 (rest L2)))
+    ((= (first L1) (first L2)) (filtrerec (rest L1) (rest L2)) )
+    (nil)))
+(println "filtrerec")
+(println (filtrerec L1 L2 ?))
+(println (filtrerec L M ?))
 
 (exit)