sicp习题答案和范例代码 - 第一章

这篇博客主要分享了SICP(Structure and Interpretation of Computer Programs)第一章节的习题答案,包括一道涉及等式判断和平方运算的Lisp代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一章未整理,先放到这里

;; ex1.3

(define (sq x)
  (* x x))

(define (greater-two-sqrt-sum a b c)
  (let ((x (min a b c)))
    (cond ((= x a) (+ (sq b) (sq c)))
          ((= x b) (+ (sq a) (sq c)))

          ((= x c) (+ (sq b) (sq a))))))

;; ex1.4
;没有区分符号和函数???

;; ex1.5
;应用序 -> recurse forever
;正则序 -> 0

;; 1.1.7 eg 牛顿法求平方根
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x) x)))

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

(define (improve guess x)
  (/ (+ guess (/ x guess)) 2))

(define (my-sqrt x)
  (sqrt-iter 1.0 x))

;; ex1.7
(define (good-enough? guess prev-guess)
  (< (/ (abs (- guess prev-guess)) guess) 0.001))

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

(define (my-sqrt x)
  (sqrt-iter 1.0 x 0))
;; ex1.8
(define (cbrt-iter guess x)
  (if (good-enough-cbrt? guess x)
      guess
      (cbrt-iter (improve-cbrt guess x) x)))

(define (good-enough-cbrt? guess x)
  (< (abs (- (* guess (sq guess)) x)) 0.001))

(define (improve-cbrt guess x)
  (/ (+ (/ x (sq guess)) (* 2 guess)) 3))

(define (my-cbrt x)
  (cbrt-iter 1.0 x))

;; ex 1.9
; 2 是尾递归
;; ex 1.10
(define (A x y)
               (cond ((= y 0) 0)
                 ((= x 0) (* 2 y))
                 ((= y 1) 2)
                 (else (A (- x 1)
                      (A x (- y 1))))))

;(A 1 10) -> 2^10
;(A 2 4)  -> 2^16
;(A 3 3)  -> 2^16

;(define (f n) (A 0 n)) -> 2*n
;(define (g n) (A 1 n)) -> 2^n
;(define (h n) (A 2 n)) -> 2^(2^(2^....(2^2)..))

;; ex 1.11
(define (f n)
  (define (f-iter a b c i)
    (if (= i n)
        c
        (f-iter b c (+ c b a) (+ i 1))))
  (if (< n 4)
      n
      (f-iter 1 2 3 3)))

;; ex 1.12
(define (pascal row col)
               (if (or (= col 0) (= col row))
               1
               (+ (pascal (1- row) col)
                  (pascal (1- row) (1- col)))))

;;1.2.4
(define (square x)
               (let ((z x))
             (* z z)))

(define (fast-expt b n)
               (cond ((= n 0) 1)
                 ((even? n) (square (fast-expt b (/ n 2))))
                 (else (* b (fast-expt b (1- n))))))

;; ex 1.16
(define (fast-expt-1 b n)
               (fast-expt-iter b n 1))

(define (fast-expt-iter b n rec)
               (cond ((= n 0) rec)
                 ((even? n) (fast-expt-iter (square b) (/ n 2) rec))
                 (else (fast-expt-iter b (1- n) (* b rec)))))

;;1.17
(define (double x)
               (* 2 x))
(define (halve x)
               (cond ((even? x) (/ x 2))
                 (else 'odd)))
(define (fast-mul a b)
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值