Racket 基本的数学运算
纯函数式编程语言不能用循环,一切这种结构都要改作递归实现
1.平方根(牛顿切线法)
#lang racket
(define (sqrt x)
(define (good-enough? a b) (< (abs (- (* a a) b)) 0.00001))
(define (improve a b) (average a (/ b a)))
(define (average a b) ( / (+ a b) 2))
(define (_sqrt guess x)
(if (good-enough? guess x)
guess
(_sqrt (improve guess x) x)
))
(_sqrt 1.0 x)
)
2. 判断质数
#lang racket
(define (isPrime x)
(define (_isPrime idx x)
(define (<= a b) (or (< a b) (= a b)))
(define (inRange? j i) (<= (* j j) i))
(if (inRange? idx x)
(if (= (remainder x idx) 0)
#f
(_isPrime (+ idx 1) x)
)
#t
)
)
(if (< x 2)
#f
(_isPrime 2 x))
)3. 求平方根(二分法)
#lang racket
(define (sqrt x)
(define (good-enough? lwbd upbd)
(let ((epsilon 0.00001))
(< (abs (- upbd lwbd)) epsilon)
)
)
(define (f x) (* x x))
(define (_sqrt lwbd upbd x)
(let ((m (/ (+ lwbd upbd) 2)))
(if (good-enough? upbd lwbd)
m
(if (> (* (- (f lwbd) x) (- (f m) x) ) 0)
(_sqrt m upbd x)
(_sqrt lwbd m x)
)
)
)
)
(_sqrt 0.0 x x)
)
4.分数的四则运算
#lang racket
(define (make-rat a b)
(let ((_a (abs a))
(_b (abs b))
)
(let ((_g (gcd _a _b)))
(if (< (* a b) 0)
(cons (- (/ _a _g)) (/ _b _g))
(cons (/ _a _g) (/ _b _g))))
)
)
(define (numer f) (car f))
(define (denom f) (cdr f))
(define (output-rat s)
(display (numer s))
(display "/")
(display (denom s))
)
(define (gcd x y)
(if (= (remainder x y) 0)
y
(gcd y (remainder x y))))
(define (add-rat a b)
(let ((_n (+ (* (numer a) (denom b)) (* (numer b) (denom a))))
(_d (* (denom a) (denom b)) ))
(make-rat _n _d))
)
(define (sub-rat a b)
(define (neg x) (make-rat (- (numer x)) (denom x)))
(add-rat a (neg b))
)
(define (mul-rat a b)
(let ((_n (* (numer a) (numer b)))
(_d (* (denom a) (denom b)))
)
(make-rat _n _d)
)
)
(define (div-rat a b)
(define (reci x)
(make-rat (denom x) (numer x)))
(mul-rat a (reci b))
)
(output-rat (add-rat (make-rat 3 5) (make-rat 1 2)))
(newline)
(output-rat (sub-rat (make-rat 4 5) (make-rat 1 7)))
(newline)
(output-rat (mul-rat (make-rat 2 5) (make-rat 1 2)))
(newline)
(output-rat (div-rat (make-rat 1 7) (make-rat 1 3)))
(newline)
5.对list的map和变长参数的imap
(define (map f h)
(if (null? h)
null
(cons (f (car h)) (map f (cdr h)))
))
(define (imap f . h)
(map f h)
)