SICP习题解答1.1-1.8

ex1.1-1.5

#lang racket

; exercise 1.1
10
(+ 5 3 4)
(- 9 1)
(/ 6 2)
(+ (* 2 4) (- 4 6))
(define a 3)
(define b (+ a 1))
(+ a b (* a b))
(= a b)
(if (and (> b a) (< b (* a b)))
      b
      a)
(cond ((= a 4) 6)
        ((= b 4) (+ 6 7 a))
        (else 25))
(+ 2 (if (> b a) b a))
(* (cond ((> a b) a)
           ((< a b) b)
           (else -1))
     (+ a 1))

; exercise 1.2
(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7)))

; exercise 1.3
(display "\nexercise 1.3\n")
(define (sum-of-bigger a b c)
  (cond ((and (<= a b) (<= a c)) (+ b c))
        ((and (<= b a) (<= b c)) (+ a c))
        (else (+ a b))))
(sum-of-bigger 1 1 2)

; exercise 1.4
(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))  ;; 运算符可以作为值返回,所以这里的if语句求值结果为+/-,然后再计算
(a-plus-abs-b 32 -12)
(a-plus-abs-b 32 12)

; exercise 1.5
(define (p) (p))
(define (test x y)
  (if (= x 0)
      0
      y))
(test 0 (p))
;; 如果是正则序求值,先代入再计算,则结果为0;如果是应用序求值,先计算参数值后再代入,所以上述代码(p)不停得调用自身,无法终止
;; DrRacket采用的是应用序,死循环

ex1.6-1.8

#lang racket

(define (sqrt x)
  (sqrt-iter 1.0 x))
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x) x)))
(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))
(define (square x)
  (* x x))
(define (improve guess x)
  (/ (+ guess (/ x guess)) 2))

;; exercise 1.6
(define (new-if predicate then-clause else-clause)
  (cond (predicate then-clause)
        (else else-clause)))
(define (new-if-sqrt x)
  (new-if-sqrt-iter 1.0 x))
(define (new-if-sqrt-iter guess x)
  (new-if (good-enough? guess x)
      guess
      (new-if-sqrt-iter (improve guess x) x)))
;; 和1.5一样的问题,在应用序求值中会先求值再代入,new-sqrt-iter没法终止,直到栈溢出



;; exercise 1.7
(define (improved-sqrt x)
  (improved-sqrt-iter 1.0 0.1 x))
(define (improved-sqrt-iter guess old-guess x)
  (if (improved-good-enough? guess old-guess x)
      guess
      (improved-sqrt-iter (improve guess x) guess x)))
(define (improved-good-enough? guess old-guess x)          ;; 修改good-enough的判断条件
  (< (abs (- guess old-guess)) (abs (* old-guess 0.001))))



;; exercise 1.8
(define (curt x)
  (curt-iter 1.0 0.1 x))
(define (curt-iter guess old-guess x)
  (if (improved-good-enough? guess old-guess x)
      guess
      (curt-iter (cu-improve guess x) guess x)))
(define (cu-improve y x)          ;; 只需修改improve过程,其他不需要改变
  (/ (+ (/ x (square y)) (* 2 y)) 3))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值