-
Notifications
You must be signed in to change notification settings - Fork 3
/
highorder.scm
83 lines (54 loc) · 1.78 KB
/
highorder.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
(define (id x) x)
(define (sum a b term next)
(if (> a b) 0 (+ (term a) (sum (next a) b term next))))
(define (accumulate op nv a b term next)
(if (> a b) nv
(op (term a) (accumulate op nv (next a) b term next))))
(define (1+ x) (+ x 1))
(define (p n x)
(define (term i) (* (+ n 1 (- i)) (expt x i)))
(accumulate + 0 0 n term 1+))
(define (q n x)
(define (op u v) (+ (* u x) v))
(accumulate-i op 0 1 (1+ n) id 1+))
(define (accumulate-i op nv a b term next)
(if (> a b) nv
(accumulate-i op (op nv (term a)) (next a) b term next)))
(define (fact n)
(accumulate * 1 1 n id 1+))
(define (pow x n)
(accumulate * 1 1 n (lambda (i) x) 1+))
(define (myexp x n)
(accumulate + 0 0 n (lambda (i) (/ (pow x i) (fact i))) 1+))
(define (exists? p? a b)
(accumulate (lambda (u v) (or u v)) #f a b p? 1+))
(define (square x) (* x x))
(define (twice f)
(lambda (x) (f (f x))))
(define (n+ n) (lambda (i) (+ i n)))
(define 1+ (n+ 1))
(define (derive f dx)
(lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
(define 2* (derive square 0.01))
(define (repeated f n)
(lambda (x)
(if (= n 0) x
(f ((repeated f (- n 1)) x)))))
(define (twice f) (repeated f 2))
(define (compose f g) (lambda (x) (f (g x))))
(define (repeated f n)
(if (= n 0) id
(compose f (repeated f (- n 1)))))
; (define (accumulate op nv a b term next)
(define (pow x n)
(accumulate * 1 1 n (lambda (i) x) 1+))
(define (repeated f n)
(accumulate compose id 1 n (lambda (i) f) 1+))
(define (derive-n f n dx)
(if (= n 0) f
(derive (derive-n f (- n 1) dx) dx)))
(define (derive-n f n dx)
((repeated (lambda (g) (derive g dx)) n) f))
; (define (accumulate op nv a b term next)
(define (derive-n f n dx)
((accumulate compose id 1 n (lambda (i) (lambda (g) (derive g dx))) 1+) f))