Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions 1/1.1.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#lang racket

(+ 5 3 4)
;; 12

(- 9 1)
;; 8

(/ 6 2)
;; 3

(+ (* 2 4) (- 4 6))
;; 6

(define a 3)
(define b (+ a 1))

(+ a b (* a b))
;; 19

(= a b)
;; #f

(if (and (> b a) (< b (* a b)))
b
a)
;; 4

(cond ((= a 4) 6)
((= b 4) (+ 6 7 a))
(else 25))
;; 16

(+ 2 (if (> b a) b a))
;; 6

(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
;; 16
6 changes: 6 additions & 0 deletions 1/1.2.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#lang racket

(/ (+ 5 4
(- 2 (- 3
(+ 6 (/ 4 5)))))
(* 3 (- 6 2) (- 2 7)))
13 changes: 13 additions & 0 deletions 1/1.3.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#lang racket

(define (f a b c)
(cond ((and (< a b) (< a c)) (+ (* b b) (* c c)))
((and (< b a) (< b c)) (+ (* a a) (* c c)))
(else (+ (* a a) (* b b)))
))

(f 1 1 1) ; 1 + 1
(f 1 2 2) ; 4 + 4
(f 2 1 2) ; 4 + 4
(f 1 2 3) ; 9 + 4
(f 3 2 1) ; 9 + 4
6 changes: 6 additions & 0 deletions 1/1.4.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#lang racket

(define (a-plus-abs-b a b)
((if (> b 0) ; if b is {nonegative, negative} ...
+ -) ; choose the {+, -} operator and ...
a b)) ; apply to (a b)
13 changes: 13 additions & 0 deletions 1/1.5.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#lang racket

(define (p) (p))
(define (test x y)
(if (= x 0) 0 y))

(test 0 (p))

;; [applicative-order]
;; Never returns; infinite loop eager evaluating (p).

;; [normal-order]
;; Returns 0; only the consequent inside test is evaluated.
26 changes: 26 additions & 0 deletions 1/1.6.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#lang racket

(provide average square)

(define (average x y)
(/ (+ x y) 2))

(define (square x) (* x x))

(define (improve guess x)
(average guess (/ x guess)))

(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))

;; (sqrt-iter 1 4)
;; Never returns; infinite loop eagerly evaluating the alternative.
24 changes: 24 additions & 0 deletions 1/1.7.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#lang racket

(require "1.6.rkt")

;; 1. Small numbers (less than 0.001) result in guesses that are never good enough.
;; 2. Large numbers will blow up the squaring inside the test.

(define (improve guess x)
(average guess (/ x guess)))

;; Works better as delta scales (so for big numbers). Relative accuracy goes down the other way.
(define (good-enough? guess last-guess)
(define delta (- guess last-guess))
(< (abs (/ delta guess)) 0.001))

(define (sqrt-iter-rec guess last-guess x)
(if (good-enough? guess last-guess)
guess
(sqrt-iter-rec (improve guess x) guess x)))

(define (sqrt-iter guess x)
(sqrt-iter-rec guess x x))

(real->decimal-string (sqrt-iter 1 4))
20 changes: 20 additions & 0 deletions 1/1.8.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#lang racket

(require "1.6.rkt")

(define (cube x) (* x x x))

(define (improve guess x)
(/ (+ (/ x (square guess))
(* 2 guess))
3))

(define (good-enough? guess x)
(< (abs (- (cube guess) x)) 0.001))

(define (cbrt-iter guess x)
(if (good-enough? guess x)
guess
(cbrt-iter (improve guess x) x)))

(real->decimal-string (cbrt-iter 1 8))