Fix the recursive optimized power calculation
[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))
7c69bee5 12(println (Puissance1 2 12))
c4cb602c
JB
13
14;(trace true)
15
16;O(log N)
17(define (Puissance2 P N)
18 (cond
c4cb602c 19 ((= N 1) P)
7c69bee5
JB
20 ((= N 2) (* P P))
21 ((> N 2)
c4cb602c
JB
22 (cond
23 ((= (mod N 2) 0) (Puissance2 (Puissance2 P 2) (/ N 2)))
7c69bee5 24 ((* P (Puissance2 (Puissance2 P 2) (/ (- N 1) 2))))))))
c4cb602c 25(println "Puissance2")
7c69bee5
JB
26(println (Puissance2 5 5))
27(println (Puissance2 2 12))
c4cb602c
JB
28
29;(trace nil)
ada8f303
JB
30
31; https://fr.wikipedia.org/wiki/Algorithme_d%27Euclide
32(define (pgcd N P)
33 (cond
34 ((< N P) (pgcd P N))
35 ((= N P) N)
36 ((= P 0) N)
37 ((pgcd (- N P) P))))
c4cb602c 38(println "PGCD")
ada8f303
JB
39(println (pgcd 12 4))
40(println (pgcd 25 5))
41(println (pgcd 21 7))
42
c4cb602c
JB
43;(trace true)
44
ada8f303 45; https://fr.wikipedia.org/wiki/Coefficient_binomial
7c69bee5 46; relation de pascal commenté
ada8f303
JB
47(define (comb N P)
48 (cond
49 ((= P 0) 1)
50 ((= N P) 1)
7c69bee5
JB
51 ;((+ (comb (- N 1) P) (comb (- N 1) (- P 1))))))
52 ((/ (* N (comb (- N 1) (- P 1))) P))))
c4cb602c
JB
53(println "comb")
54(println (comb 5 4))
55(println (comb 60 4))
7c69bee5 56(println "(comb 12 8) = "(comb 12 8))
c4cb602c
JB
57
58;(trace nil)
59
60(setq L '(3 7 + 4 2 + *))
61(setq P '())
62(define (calculExp P L)
63 (cond
64 ((null? L) 0)
65 ((= (first L) '+) (+ (first P) (calculExp (rest P) (rest L))))
66 ((= (first L) '-) (- (first P) (calculExp (rest P) (rest L))))
67 ((= (first L) '*) (* (first P) (calculExp (rest P) (rest L))))
68 ;FIXME: test for divide by zero
69 ((= (first L) '/) (/ (first P) (calculExp (rest P) (rest L))))
70 ((cons (first L) (calculExp P (rest L))))))
71;(println (calculExp P L))
ada8f303
JB
72
73(exit)