SICP习题解答1.9-1.19

ex1.9-1.10

#lang racket

; exercise 1.9
;; 第一个是递归计算过程,第二个是迭代计算过程


; exercise 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)
;; 1024
;; > (A 2 4)
;; 65536
;; > (A 3 3)
;; 65536
;; >
(define (f n) (A 0 n)) ;; 2n
(define (g n) (A 1 n)) ;; 2^n
(define (h n) (A 2 n)) ;; 2^2..^2 (以2为底,做n次平方)

ex1.11-1.12

#lang racket

; exercise 1.11
;; 递归
(define (f-rec n)
  (if (< n 3)
      n
      (+ (f-rec (- n 1)) (* 2 (f-rec (- n 2))) (* 3 (f-rec (- n 3))))))
;; 迭代
(define (f-iter n)
  (if (< n 3)
      n
      (f-it 2 1 0 n)))
(define (f-it a b c n)
  (if (< n 3)
      a
      (f-it (+ a (* 2 b) (* 3 c)) a b (- n 1))))


; exercise 1.12
(define (YangHui-triangle row col)
  (cond ((or (= col 0) (= row col)) 1)
        (else (+ (YangHui-triangle (- row 1) col) (YangHui-triangle (- row 1) (- col 1))))))

ex1.14-1.9

#lang racket

; exercise 1.14
;; 空间O(n^2) 时间O(a^n) (a是硬币种数,n是输入值)

; exercise 1.15
;; a) p调用5次 (p (p (p (p (p (sine 0.05))))))
;; b) 空间和步数为对数级别:ceil(log3(10a))

; exercise 1.16
(define (fast-expt b n)
  (if (= n 0)
      1
      (iter b n 1)))
(define (iter b n k)
  (cond ((= n 1) (* b k))
        ((even? n) (iter (* b b) (/ n 2) k))
        (else (iter (* b b) (/ (- n 1) 2) (* k b)))))
(define (even? n)
  (= (remainder n 2) 0))

; exercise 1.17
(define (double n)
  (+ n n))
(define (halve n)
  (/ n 2))
(define (fast-rec-* a b)
  (cond ((= b 0) 0)
      ((even? b) (double (fast-rec-* a (halve b))))
      (else (+ a (fast-rec-* a (- b 1))))))

; exercise 1.18
(define (fast-* a b)
  (fast-*-iter a b 0))
(define (fast-*-iter a b k)
  (cond ((= b 0) k)
        ((even? b) (fast-*-iter (double a) (halve b) k))
        (else (fast-*-iter a (- b 1) (+ a k)))))

; exercise 1.19
(define (fib n) 
   (fib-iter 1 0 0 1 n)) 
 (define (fib-iter a b p q count) 
   (cond ((= count 0) b) 
         ((even? count) 
          (fib-iter a 
                    b 
                    (+ (square p) (square q)) ;; p'=p^2+q^2   q'=q^2+2pq 可以推导出来
                    (+ (* 2 p q) (square q)) 
                    (/ count 2))) 
         (else (fib-iter (+ (* b q) (* a q) (* a p)) 
                         (+ (* b p) (* a q)) 
                         p 
                         q 
                         (- count 1))))) 
 (define (square x) (* x x)) 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值