SICP_3.15-3.20

3.15

对于z1

z1 ------>[ * ][ * ]

                |     |

               v     v

              [ * ][ * ]----->[ * ][ ]

                |                  |

               v                  v

               wow             b

对于z2

z2 ----->[ * ][ * ]

               |     |                            

               |     + ------------------>[ * ][ * ]------>[ * ][ ]

               |                                  |                    |

               |                                  v                   v

               |                                  a                   b

               |                                                       ^

               |                                                       |

               +----------------------->[ * ][ * ]------>[ * ][ ]

                                                  |

                                                  v

                                                  wow

3.16

 1 (define l2 (list 1))
 2 (define l3 (cons l2 l2))        ->结果为4
 3 (define l4 (list l3))
 4 
 5 
 6 (define l1 '(1 2 3))  ->结果为3
 7 
 8 (define l5 (list a))
 9 (define l6 (cons l5 l5))
10 (define l7 (cons l6 l6))         ->结果为7

 1 (define l8 (set-car! (cddr l1) l1)) ->什么都不返回

3.17

1 (define new-count-pairs
2   (let ((store '()))
3     (lambda (x)
4       (cond ((not (pair? x)) 0)
5             ((memq x store) 0)
6             (else (set! store (cons x store))
7                   (+ (new-count-pairs (car x))
8                      (new-count-pairs (cdr x))
9                      1))))))

把检查过的元素放到一个表中。在计数之前检查是否存在。注意memq的用法!!!

3.18

这一题的一些解法

1 (define (cycle? x)
2   (define (iter search-list seen)
3     (cond ((not (pair? search-list)) #f)
4           ((memq search-list seen) #t)
5           (else (or (iter (car search-list) (cons search-list seen))
6                     (iter (cdr search-list) (cons search-list seen))))))
7   (iter x '()))

这一题重点是要注意car也可以形成环

另一种貌似有问题的解法

他这里的解法没有考虑表中出现重复元素的情况。

3.19

 1 (define (loop? ls)
 2   (define (iter x y)
 3     (let ((x-walk (list-walks 1 x))
 4           (y-walk (list-walks 2 y)))
 5       (cond ((or (null? x-walks) (null? y-walks)) #f)
 6             ((eq? x-walks y-walks) #t)
 7             (else (iter x-walk y-walk)))))
 8   (iter ls ls))
 9 
10 (define (list-walks step ls)
11   (cond ((null? ls) '())
12         ((zero? step) ls)
13         (else (list-walks (- step 1)
14                           (cdr ls)))))

不会这题,参考,用了算法:龟兔赛跑

3.20

还是理解的不透彻

Yosoro
原文地址:https://www.cnblogs.com/tclan126/p/6562217.html