Racket 基本的数学运算
纯函数式编程语言不能用循环,一切这种结构都要改作递归实现
1.平方根(牛顿切线法)
Racket
x
13
13
1
#lang racket
2
(define (sqrt x)
3
(define (good-enough? a b) (< (abs (- (* a a) b)) 0.00001))
4
(define (improve a b) (average a (/ b a)))
5
(define (average a b) ( / (+ a b) 2))
6
(define (_sqrt guess x)
7
(if (good-enough? guess x)
8
guess
9
(_sqrt (improve guess x) x)
10
))
11
(_sqrt 1.0 x)
12
)
13
2. 判断质数
Racket
1
17
17
1
#lang racket
2
(define (isPrime x)
3
(define (_isPrime idx x)
4
(define (<= a b) (or (< a b) (= a b)))
5
(define (inRange? j i) (<= (* j j) i))
6
(if (inRange? idx x)
7
(if (= (remainder x idx) 0)
8
#f
9
(_isPrime (+ idx 1) x)
10
)
11
#t
12
)
13
)
14
(if (< x 2)
15
#f
16
(_isPrime 2 x))
17
)
3. 求平方根(二分法)
Racket
1
22
22
1
#lang racket
2
(define (sqrt x)
3
(define (good-enough? lwbd upbd)
4
(let ((epsilon 0.00001))
5
(< (abs (- upbd lwbd)) epsilon)
6
)
7
)
8
(define (f x) (* x x))
9
(define (_sqrt lwbd upbd x)
10
(let ((m (/ (+ lwbd upbd) 2)))
11
(if (good-enough? upbd lwbd)
12
m
13
(if (> (* (- (f lwbd) x) (- (f m) x) ) 0)
14
(_sqrt m upbd x)
15
(_sqrt lwbd m x)
16
)
17
)
18
)
19
)
20
(_sqrt 0.0 x x)
21
)
22
4.分数的四则运算
Racket
1
52
52
1
#lang racket
2
(define (make-rat a b)
3
(let ((_a (abs a))
4
(_b (abs b))
5
)
6
(let ((_g (gcd _a _b)))
7
(if (< (* a b) 0)
8
(cons (- (/ _a _g)) (/ _b _g))
9
(cons (/ _a _g) (/ _b _g))))
10
)
11
)
12
(define (numer f) (car f))
13
(define (denom f) (cdr f))
14
(define (output-rat s)
15
(display (numer s))
16
(display "/")
17
(display (denom s))
18
)
19
(define (gcd x y)
20
(if (= (remainder x y) 0)
21
y
22
(gcd y (remainder x y))))
23
(define (add-rat a b)
24
(let ((_n (+ (* (numer a) (denom b)) (* (numer b) (denom a))))
25
(_d (* (denom a) (denom b)) ))
26
(make-rat _n _d))
27
)
28
(define (sub-rat a b)
29
(define (neg x) (make-rat (- (numer x)) (denom x)))
30
(add-rat a (neg b))
31
)
32
(define (mul-rat a b)
33
(let ((_n (* (numer a) (numer b)))
34
(_d (* (denom a) (denom b)))
35
)
36
(make-rat _n _d)
37
)
38
)
39
(define (div-rat a b)
40
(define (reci x)
41
(make-rat (denom x) (numer x)))
42
(mul-rat a (reci b))
43
)
44
(output-rat (add-rat (make-rat 3 5) (make-rat 1 2)))
45
(newline)
46
(output-rat (sub-rat (make-rat 4 5) (make-rat 1 7)))
47
(newline)
48
(output-rat (mul-rat (make-rat 2 5) (make-rat 1 2)))
49
(newline)
50
(output-rat (div-rat (make-rat 1 7) (make-rat 1 3)))
51
(newline)
52
5.对list的map和变长参数的imap
Scheme
1
8
1
(define (map f h)
2
(if (null? h)
3
null
4
(cons (f (car h)) (map f (cdr h)))
5
))
6
(define (imap f . h)
7
(map f h)
8
)