Advertisement
Guest User

sicp chapter 1 half

a guest
Jun 17th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 14.45 KB | None | 0 0
  1. ; Exercise 1.4
  2. define (sum-of-larger-two a b c)
  3.   (cond   (((< a b) and (< a c)) (sum-of-squares b c))
  4.           (((< b a) and (< b c)) (sum-of-squares a c))
  5.           (((< c a) and (< c b)) (sum-of-squares a b)))
  6.  
  7. (define (sqrt-iter guess x)
  8.   (if (good-enough? guess x) ;give predicates names ending in ?, a normal character
  9.     guess
  10.     (sqrt-iter (improve guess x)
  11.                 x)))
  12.  
  13.  
  14. (define (improve guess x)
  15.   (average guess (/ x guess)))
  16.  
  17. where
  18.  
  19. (define (average x y)
  20.   (/ (+ x y) 2))
  21.  
  22. (define (good-enough? guess x)
  23.   (< (abs (- (square guess) x)) 0.001))
  24.  
  25. (define (sqrt x)
  26.   (sqrt-iter 1.0 x))
  27.  
  28. (sqrt 9)
  29. ;3.000091554...
  30.  
  31. (define (new-if predicate then-clause else-clause)
  32.   (cond (predicate then-clause)
  33.         (else else-clause)))
  34.  
  35. (define (sqrt-iter guess x)
  36.   (new-if (good-enough? guess x)
  37.     guess
  38.     (sqrt-iter (improve guess x)
  39.                 x)))
  40.  
  41. ; will blow up as enter infinite loop
  42. ; new-if not a special form, will eval all operands, incl (sqrt-iter (improve guess x) x)
  43.  
  44. (define (sqrt-iter guess oldguess x)
  45.   (if (good-enough? guess oldguess)
  46.     guess
  47.     (sqrt-iter (improve guess x) guess x)))
  48.  
  49. (define (good-enough? guess oldguess)
  50.   (< (abs (- guess oldguess)) (*guess 0.001)))
  51.  
  52. (define (sqrt x)
  53.   (sqrt-iter 1.0 2.0 x))
  54.  
  55. ; sqrt-iter is recursive, and is defined in terms of itself
  56. ; 1. how to tell if guess is good-enough?
  57. ; 2. how to improve guess
  58. ; 3. how to create recursive procedure
  59. ; problem decomposed into subproblems
  60. ; sub-problem viewed as black box; a procedural abstraction; concerning what, not how
  61. ; user should not need to know how the procedure is implemented...
  62.  
  63. ; exercise 1.8
  64.  
  65. (define (square x) (* x x))
  66.  
  67. (define (cube-root-iter guess oldguess x)
  68.   (if (good-enough? guess oldguess)
  69.     guess
  70.     (cube-root-iter (improve guess x) guess x)))
  71.  
  72. (define (improve guess x)
  73.   (/ (+ (/ x (square guess)) (* 2 guess)) 3))
  74.  
  75. (define (good-enough? guess oldguess)
  76.   (< (abs (- guess oldguess)) (abs (* guess 0.001))))
  77.  
  78. (define (cube-root x)
  79.   (cube-root-iter 1.0 0.0 x))
  80.  
  81. (define (cube-root x)
  82.   ((if (< x 0) - +)(cube-root-iter (improve 1.0 (abs x)) 1 (abs x))))
  83.  
  84.  
  85. (define (square x) (* x x))
  86.  
  87. ; above and below separate definitions of square x
  88.  
  89. (define (square x)
  90.   (exp (double (log x))))
  91.  
  92. (define (double x) (+ x x))
  93.  
  94.  
  95. ; block structure, nesting of definitions as solution to name-packaging problem
  96.  
  97. (define (sqrt x)
  98.   (define (good-enough? guess x)
  99.     (< (abs (- (square guess) x)) 0.001))  
  100.   (define (improve guess x)
  101.     (average guess (/ x guess)))
  102.   (define (sqrt-iter guess x)
  103.     (if (good-enough? guess x)
  104.       guess
  105.       (sqrt-iter (improve guess x) x)))
  106.   (sqrt-iter 1.0 x))
  107.  
  108.  
  109. ; allow x to be a free variable in the internal definitions
  110. ; lexical scoping
  111.  
  112. (define (sqrt x)
  113.   (define (good-enough? guess)
  114.     (< (abs (- (square guess) x)) 0.001))  
  115.   (define (improve guess)
  116.     (average guess (/ x guess)))
  117.   (define (sqrt-iter guess)
  118.     (if (good-enough? guess)
  119.       guess
  120.       (sqrt-iter (improve guess))))
  121.   (sqrt-iter 1.0))
  122.  
  123.  
  124. n! = n (n-1)!
  125.  
  126. (define (factorial n)
  127.   (if (= n 1)
  128.     1
  129.     (* n (factorial (- n 1)))))
  130.  
  131. ; above has shape of expansion followed by contraction
  132. ; expansion when building up a chain of deferred operations
  133. ; contraction when operations are actually performed
  134. ; ^ recursive process
  135. ; requires interpreter keep track of operations to be performed later on
  136. ; info grows linearly with n
  137. ; ^ linear recursive process
  138.  
  139.  
  140. ; product = product * counter
  141. ; counter = counter + 1
  142.  
  143. (define (factorial n)
  144.   (define (iter product counter)
  145.     (if (> counter n)
  146.       product
  147.       (iter (* product counter) (+ counter 1))))
  148.   (iter 1 1))
  149.  
  150. ; keep track of variables only: product, counter
  151. ; fixed number of state variables
  152. ; state is captured completely by its state variables
  153. ; ^linear iterative process
  154.  
  155. (define (+ a b)
  156.   (if (= a 0)
  157.     b
  158.     (inc (+ (dec a) b))))
  159.  
  160. (+ 4 5)
  161. (inc (+ (dec 4) 5))
  162. (inc (+ 3 5))
  163. (inc (inc (+ dec (3) 5)))
  164. (inc (inc (+ 2 5)))
  165. (inc (inc (inc (+ (dec 2) 5))))
  166. (inc (inc (inc (+ 1 5))))
  167. (inc (inc (inc (inc (+ (dec 1) 5)))))
  168. (inc (inc (inc (inc (+ 0 5)))))
  169. (inc (inc (inc (inc 5))))
  170. (inc (inc (inc 6)))
  171. (inc (inc 7))
  172. (inc 8)
  173. 9
  174.  
  175. ; recursive process
  176. ; build up chain of deferred operations
  177.  
  178.  
  179. (define (+ a b)
  180.   (if (= a 0)
  181.     b
  182.     (+ (dec a) (inc b))))
  183.  
  184.  
  185. (+ 4 5)
  186. (+ (dec 4) (inc 5))
  187. (+ 3 6)
  188. (+ (dec 3) (inc 6))
  189. (+ 2 7)
  190. (+ (dec 2) (inc 7))
  191. (+ 1 8)
  192. (+ (dec 1) (inc 8))
  193. (+ 0 9)
  194. 9
  195.  
  196. ; iterative process
  197. ; state variables a,b
  198. ; (+ 4 5) = (+ 3 6) = (+ 2 7) = (+ 1 8) = (+ 0 9)
  199.  
  200.  
  201. (define (A x y)
  202.   (cond ((= y 0) 0)
  203.         ((= x 0) (* 2 y))
  204.         ((= y 1) 2)
  205.         (else (A (- x 1)
  206.               (A x (- y 1)))))
  207.  
  208.  
  209. (A 1 10)
  210. (A 0 (A 1 9))
  211. (A 0 (A 0 (A 1 8))
  212. (A 0 (A 0 (A 0 (A 1 7)))
  213. (A 0 (A 0 (A 0 (A 0 (A 1 6))))
  214. (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 5)))))
  215. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 4))))))
  216. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 3)))))))
  217. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 2))))))))
  218. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1)))))))))
  219. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 2)))))))))
  220. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 4))))))))
  221. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 8)))))))
  222. (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 16))))))
  223. .
  224. .
  225. .
  226. (A 0 512)
  227. 1024
  228.  
  229. (A 2 4)
  230. (A 1 (A 2 3))
  231. (A 1 (A 1 (A 2 2))))
  232. (A 1 (A 1 (A 1 (A 2 1))))
  233. (A 1 (A 1 (A 1 2)))
  234. (A 1 (A 1 (A 0 (A 1 1))))
  235. (A 1 (A 1 (A 0 2)))
  236. (A 1 (A 1 4))
  237. (A 1 (A 0 (A 1 3)))
  238. (A 1 (A 0 (A 0 (A 1 2))))
  239. (A 1 (A 0 (A 0 (A 0 (A 1 1)))))
  240. (A 1 (A 0 (A 0 (A 0 2))))
  241. (A 1 (A 0 (A 0 4))
  242. (A 1 (A 0 8))
  243. (A 1 16)
  244. .
  245. .
  246. .
  247. 65536
  248.  
  249. (A 2 4)
  250. (A 1 (A 1 4))
  251. (A 1 16)
  252. 2^16
  253. 2^(2^4)
  254. 2^(2^2^2)
  255.  
  256. (A 2 3)
  257. (A 1 (A 2 2))
  258. (A 1 (A 1 (A 2 1))))
  259. (A 1 (A 1 2)
  260. (A 1 (A 0 (A 1 1)))
  261. (A 1 (A 0 2))
  262. (A 1 4)
  263. 16
  264.  
  265. (A 2 3)
  266. 2^(2^2)
  267.  
  268.  
  269. (A 3 3)
  270. (A 2 (A 3 2))
  271. (A 2)
  272.  
  273. (f n) = 2n
  274. (g n) = 2^n
  275. (h n) = 2^2^2 (n times)
  276. (k n) = 5n^2
  277.  
  278.  
  279. (define (fib n)
  280.   (cond ((= n 0) 0)
  281.         ((= n 1) 1))
  282.         (else (+  (fib(n-1)
  283.                   (fib(n-2))))))
  284.  
  285. (fib 5)
  286. (+ (fib 4) (fib 3))
  287. (+ (+ (fib 3) (fib 2)) (+ (fib 2) (fib 1)))
  288. (+ (+ (+ (fib 2) (fib 1)) (+ (fib 1) (fib 0))) (+ (+ (fib 1) (fib 0)) (fib 1)))
  289. (+ (+ (+ (+ (fib 1) (fib 0)) (fib 1)) (+ (fib 1) (fib 0))) (+ (+ (fib 1) (fib 0)) (fib 1)))
  290. (+ (+ (+ (+ 1 0) 1) (+ 1 0)) (+ (+ 1 0) 1))
  291. (+ 3 2)
  292. 5
  293.  
  294. (define (fib n)
  295.   (fib-iter 1 0 n))
  296.  
  297. (define (fib-iter a b count)
  298.   (if (= count 0)
  299.     b
  300.     (fib-iter (+ a b) a (- count 1))))
  301.  
  302. ; linear iteration; number of steps linear in n
  303. ; 3 state vars: a, b, count
  304.  
  305.  
  306. 1.00 , 0.50, 0.25, 0.10, 0.05, 0.01
  307.  
  308. make change of 1.00
  309. more generally, write procedure to compute ways to change any given amt of money
  310.  
  311. change amount a using n kinds of coins:
  312.   use 0 of coin d
  313.   use >= 1 of coin d
  314.  
  315. (define (count-change amount)
  316.   (cc amount 5))
  317.  
  318. (define (cc amount kinds-of-coins)
  319.   (cond ((= amount 0) 1)
  320.         ((or (< amount 0) (= kinds-of-coins 0)) 0)
  321.         (else (+  (cc amount
  322.                     (- kinds-of-coins 1))
  323.                   (cc (- amount (first-denomination kinds-of-coins))
  324.                       kinds-of-coins)))))
  325.  
  326. (define (first-denomination kinds-of-coins)
  327.   (cond ((= kinds-of-coins 1) 1)
  328.         ((= kinds-of-coins 2) 5)
  329.         ((= kinds-of-coins 3) 10)
  330.         ((= kinds-of-coins 4) 25)
  331.         ((= kinds-of-coins 5) 50)))
  332.  
  333. ; first-denomination takes as input the number of coins available and returns the largest coin
  334.  
  335. (count-change 100)
  336. 292
  337.  
  338.  
  339. (define (f n)
  340.   (cond ((< n 3) n)
  341.         (else (+ (f (- n 1))
  342.                 (* 2 (f (- n 2)))
  343.                 (* 3 (f (- n 3)))))))
  344.  
  345. (define (pascal r c)
  346.   (if (or (= c 1) (= c r))
  347.     1
  348.     (+ (pascal (- r 1) (- c 1)) (pascal (- r 1) c))))
  349.  
  350.  
  351. n measures size of problem
  352. R(n) is amount of resources the process requires for problem of size n
  353.  
  354. ; order of growth indicate how we may expect the behavior of the process to change as we
  355. ; change the size of the problem
  356.  
  357. sin x = 3*sin(x/3) - 4*(sin(x/3)^3)
  358.  
  359. (define (sine angle)
  360.   (if   (not (> (abs angle) 0.1))
  361.         angle
  362.         (p (sine (/ angle 3.0)))))
  363.  
  364. (define (cube x) (* x x x))
  365.  
  366. (define (p x) (- (* 3 x) (* 4 (cube x))))
  367.  
  368.  
  369. ; how many times p interpreted
  370.  
  371. (sine 12.15)
  372. (p (sine 4.05))
  373. (p (p (sine 1.35)))
  374. (p (p (p (sine 0.45))))
  375. (p (p (p (p (sine 0.15)))))
  376. (p (p (p (p (p (sine 0.05))))))
  377. (p (p (p (p (p (0.05))))))
  378.  
  379.  
  380. (ceiling (/ (log (/ a 0.1)) (log 3)))
  381.  
  382.  
  383. (define (expt b n)
  384.   (if (= n 0)
  385.     1
  386.     (* b (expt b (- n 1)))))
  387.  
  388. ; linear recursive process above - xn steps and yn space
  389.  
  390. ; iterative process below - xn steps and y space
  391.  
  392. (define (expt b n)
  393.   (expt-iter b n 1))
  394.  
  395. (define (expt-iter b counter product)
  396.   (if (= counter 0)
  397.     product
  398.     (expt-iter b (- counter 1) (* b product))))
  399.  
  400. ; successive squaring below
  401.  
  402. (define (fast-expt b n)
  403.   (cond ((= n 0) 1)
  404.         ((even? n) (square (fast-expt b (/ n 2))))
  405.         (else (* b (fast-expt b (- n 1))))))
  406.  
  407. (define (even? n)
  408.   (= remainder n 2) 0)
  409.  
  410. ; logarithmic growth; computing b^2n is one more multiplication than b^n
  411. ; k log(n) growth
  412.  
  413. ; below will be the successive squaring iterative algorithm
  414.  
  415. (define (fast-expt b n)
  416.   (define (iter a b n)
  417.     (cond  ((= n 0) a)
  418.             ((even? n) (iter a (square b) (/ n 2)))
  419.             (else (iter (* a b) b (- n 1)))))
  420.   (iter 1 b n))
  421.  
  422. (define (square x) (* x x))
  423.  
  424.  
  425. (define (* a b)
  426.   (if (= b 0)
  427.     0
  428.     (+ a (* a (- b 1)))))
  429.  
  430. ; linear recursive
  431. ; successive below
  432.  
  433. (define (* a b)
  434.   (cond ((= b 0) 0)
  435.         ((even? y) (* (double a) (halve b)))
  436.         (else (+ a (* a (- b 1))))))
  437.  
  438. (define (double a) (+ a a))
  439. (define (halve a) (/ a 2))
  440.  
  441. ; iterative below
  442.  
  443. (define (fast-mult x y)
  444.   (define (iter a x y)
  445.     (cond ((= y 0) a)
  446.           ((even? y) (iter a (* x 2) (/ y 2)))
  447.           (else (iter (+ a x) x (- y 1)))))
  448.   (iter 0 x y))
  449.  
  450. ; revision of Fibonacci numbers
  451.  
  452. ; start with tree recursion; f(5) branches into f(4) and f(3)...
  453. (define (fib n)
  454.   (cond ((= n 0) 0)
  455.         ((= n 1) 1)
  456.         (else (+  (fib (- n 1))
  457.                   (fib (- n 2))))))
  458.  
  459. ; next with iterative process
  460. ; after each step,
  461. ; a <- a + b
  462. ; b <- a
  463.  
  464. (define (fib n)
  465.   (fib-iter 1 0 n))
  466.  
  467. (define (fib-iter a b count)
  468.   (if (= count 0)
  469.     b
  470.     (fib-iter (+ a b) a (- count 1))))
  471.  
  472.  
  473. ; now for final logarithmic process
  474.  
  475. (define (fib n)
  476.   (fib-iter 1 0 0 1 n))
  477.  
  478. (define (fib-iter a b p q count)
  479.   (cond ((= count 0) b)
  480.         ((even? count)
  481.           (fib-iter a
  482.                     b
  483.                     (+ (square p) (square q))
  484.                     (+ (square q) (* 2 p q))))
  485.         (else (fib-iter (+ (* b q) (* a q) (* a p))
  486.                         (+ (* b p) (* a q))
  487.                         p
  488.                         q
  489.                         (- count 1)))))
  490.  
  491. GCD(206,40) = GCD(40,6)
  492.             = GCD(6,4)
  493.             = GCD(4,2)
  494.             = GCD(2,0)
  495.             = 2
  496.  
  497. (define (gcd a b)
  498.   (if (= b 0)
  499.     a
  500.     (gcd b (remainder a b))))
  501.  
  502. (gcd 206 40)
  503. (if (= 40 0)...)
  504. (gcd 40 (remainder 206 40))
  505. (if (= (remainder 206 40) 0))
  506. (if (= 6 0))
  507. (gcd (remainder 206 40) (remainder 40 (remainder 206 40)))
  508. (if (= (remainder 40 (remainder 206 40)) 0) ...)
  509. (gcd (remainder 40 (remainder 206 40) (remainder (remainder 206 40) (remainder 40 (remainder 206 40))))
  510. ...
  511.  
  512.  
  513. (define (count-remainders n)
  514.   (define (loop n sum)
  515.     (if (= n 0) (- sum 1)
  516.         (loop (- n 1) (+ sum (fib n) (fib (- n 1))))))
  517.   (loop n 0))
  518.  
  519. ; whereas if it is applicative-order
  520.  
  521. (gcd 206 40)
  522. (gcd 40 (remainder 206 40))
  523. (gcd 40 6)
  524. (gcd 6 (remainder 40 6))
  525. (gcd 6 4)
  526. (gcd 4 (remainder 6 4))
  527. (gcd 4 2)
  528. (gcd 2 (remainder 4 2))
  529. (gcd 2 0)
  530. 2
  531.  
  532. ; if n is prime, smallest divisor greater than 1 is n; if n = 2, it is prime also
  533.  
  534.  
  535. (define (prime? n)
  536.   (= n (smallest-divisor n)))
  537.  
  538. (define (smallest-divisor n)
  539.   (find-divisor n 2))
  540.  
  541. (define (find-divisor n test-divisor)
  542.   (cond ((> (square test-divisor) n) n)
  543.         ((divides? test-divisor n) test-divisor)
  544.         (else (smallest-divisor n (+ test-divisor 1)))))
  545.  
  546. (define (divides? test-divisor n)
  547.   (= (remainder n test-divisor) 0))
  548.  
  549. (define (square x) (* x x))
  550.  
  551. (define (remainder n divisor)
  552.   (if (< n divisor)
  553.     n
  554.     (remainder (- n divisor) divisor)))
  555.  
  556. (smallest-divisor 199)
  557. (smallest-divisor 1999)
  558. (smallest-divisor 19999)
  559.  
  560. ; if n is not prime it must have a divisor less than or equal to sqrt(n)
  561. ; order of growth (k sqrt(n))
  562.  
  563. (define (expmod base exp m)
  564.   (cond ((= exp 0) 1)
  565.         ((even? exp)
  566.           (remainder (square (expmod base (/ exp 2) m))
  567.                       m))
  568.         (else
  569.           (remainder (* base (expmod base (- exp 1) m))
  570.                       m))))
  571.  
  572.  
  573. (define (fermat-test n)
  574.   (define (try-it a)
  575.     (= (expmod a n n) a))
  576.   (try-it (+ 1 (random (- n 1)))))
  577.  
  578. (define (fast-prime? n times)
  579.   (cond ((= times 0) true)
  580.         ((fermat-test n) (fast-prime? n (- times 1))) ; if true, repeat with times-1
  581.         (else false)))
  582.  
  583.  
  584. ; search-for-primes 1000
  585. ; to find the three smallest primes larger than 1000, then 10,000, then 100,000, ...
  586. ; note the time needed to test each prime
  587.  
  588. (define (search-for-primes range-start)
  589.   (if (even? start)
  590.     (find-primes (+ start 1) 3) ; if even, plus one
  591.     (find-primes (+ start 2) 3))) ; if odd, disregard starting number
  592.  
  593.  
  594.  
  595. (define (square x) (* x x))
  596.  
  597. (define (smallest-divisor n)
  598.   (find-divisor n 2))
  599.  
  600. (define (find-divisor n test-divisor)
  601.   (cond ((> (square (test-divisor)) n) n)
  602.         ((divides? test-divisor n) (test-divisor))
  603.         (else (find-divisor n (+ test-divisor 1)))))
  604.  
  605. (define (divides? a b)
  606.   (= (remainder b a) 0))
  607.  
  608. (define (prime? n)
  609.   (= n (smallest-divisor n)))
  610.  
  611. ; auxiliary functions above, main functions below
  612.  
  613. (define (search-for-primes start)
  614.   (if (even? start)
  615.     (search-iter (+ start 1) 3) ; one of these will jump into search-iter function!
  616.     (search-iter (+ start 2) 3)); supplied count = 3, current value depends on even/odd
  617.  
  618. (define (search-iter current count)
  619.   (cond ((= count 0) 0)) ; below is multiple executions in single body clause????
  620.         ((prime? current) ((timed-prime-test current) (search-iter (+ current 2) (- count 1))))
  621.         (else (search-iter (+ current 2) count)))
  622.  
  623. (define (timed-prime-test n)
  624.   (start-prime-test n runtime))
  625.  
  626. (define (start-prime-test n start-time)
  627.   (if (prime? n)
  628.       (report-prime n (- (runtime) start-time))))
  629.  
  630. (define (report-prime n elapsed-time)
  631.   (newline)
  632.   (display n)
  633.   (display " *** ")
  634.   (display elapsed-time))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement