* Fix aplatir function
[TD_LISP.git] / exercices / arithmetic.lsp
CommitLineData
ada8f303
JB
1#!/usr/bin/env newlisp
2
c4cb602c
JB
3;O(N)
4(define (Puissance1 P N)
ada8f303
JB
5 (cond
6 ((= N 0) 1)
7 ((= N 1) P)
c4cb602c
JB
8 ((< N 0) (div 1 (Puissance1 P (- N))))
9 ((* P (Puissance1 P (- N 1))))))
10(println "Puissance1")
11(println (Puissance1 5 5))
12
13;(trace true)
14
15;O(log N)
16(define (Puissance2 P N)
17 (cond
18 ((= N 0) 1)
19 ((= N 1) P)
20 ((> N 1)
21 (cond
22 ((= (mod N 2) 0) (Puissance2 (Puissance2 P 2) (/ N 2)))
23 ((* P (Puissance2 (Puissance2 P 2) (/ (- 1 N) 2))))))))
24(println "Puissance2")
25;(println (Puissance2 5 5))
26
27;(trace nil)
ada8f303
JB
28
29; https://fr.wikipedia.org/wiki/Algorithme_d%27Euclide
30(define (pgcd N P)
31 (cond
32 ((< N P) (pgcd P N))
33 ((= N P) N)
34 ((= P 0) N)
35 ((pgcd (- N P) P))))
c4cb602c 36(println "PGCD")
ada8f303
JB
37(println (pgcd 12 4))
38(println (pgcd 25 5))
39(println (pgcd 21 7))
40
c4cb602c
JB
41;(trace true)
42
ada8f303 43; https://fr.wikipedia.org/wiki/Coefficient_binomial
c4cb602c 44; relation de pascal
ada8f303
JB
45(define (comb N P)
46 (cond
47 ((= P 0) 1)
48 ((= N P) 1)
c4cb602c
JB
49 ((+ (comb (- N 1) P) (comb (- N 1) (- P 1))))))
50(println "comb")
51(println (comb 5 4))
52(println (comb 60 4))
53
54;(trace nil)
55
56(setq L '(3 7 + 4 2 + *))
57(setq P '())
58(define (calculExp P L)
59 (cond
60 ((null? L) 0)
61 ((= (first L) '+) (+ (first P) (calculExp (rest P) (rest L))))
62 ((= (first L) '-) (- (first P) (calculExp (rest P) (rest L))))
63 ((= (first L) '*) (* (first P) (calculExp (rest P) (rest L))))
64 ;FIXME: test for divide by zero
65 ((= (first L) '/) (/ (first P) (calculExp (rest P) (rest L))))
66 ((cons (first L) (calculExp P (rest L))))))
67;(println (calculExp P L))
ada8f303
JB
68
69(exit)