SICP読書女子会#18 2.2.1 ~ 2.2.2

  • 0
    いいね
  • 0
    コメント

    2.2.1

    SICP/2.2.1.scm at master · cocodrips/SICP

    Ex 2.21

    引数として数値のリストをとり、
    それらの数値の二乗の列を持つリストを返す手続き square-list

    (display "==========Ex 2.21===========")
    (newline)
    
    (define (square-list items)
        (if (null? items)
            (list)
            (cons (* (car items) (car items)) (square-list (cdr items)))))
    
    (display (square-list (list 1 2 3 4)))
    (newline)
    ;(1 4 9 16)
    
    
    (define (square-list items)
        (map (lambda (x) (* x x)) items))
    
    (display (square-list (list 5 6 7 8)))
    (newline)
    ;(25 36 49 64)
    

    Ex 2.22

    反復プロセスで2.21を書くと、リストが逆順になる。
    もがいてもだめ。なぜか。

    前回の2.20で色々考えたやつだ。
    リストの構造的に逆からは作れないから、
    1こ目の方法で書いて、reverseするのがいいんじゃないか?
    という話だったはず。

    SICP読書女子会#17 2.2.1 > 別解放 filter && reverseでstack節約 - Qiita

    (define (square x) (* x x))
    
    (define (square-list items)
        (define (iter things answer)
            (if (null? things)
                answer
                (iter (cdr things)
                        (cons (square (car things))
                        answer))))
        (iter items (list)))
    (display (square-list (list 5 6 7 8)))
    (newline)
    ;(64 49 36 25)
    
    (define (square-list items)
        (define (iter things answer)
            (if (null? things)
                answer
                (iter (cdr things)
                    (cons answer
                    (square (car things))))))
        (iter items (list)))
    (display (square-list (list 5 6 7 8)))
    (newline)
    ;((((() . 25) . 36) . 49) . 64)
    

    Ex2.23

    手続き for-each は map に似ている。引数として手続きと要素のリストを取る。

    (display "==========Ex 2.23===========")
    (newline)
    
    
    (define (for-each-orig f items)
        (cond 
            ((null? items) #t)
            (else 
                (f (car items))
                (for-each-orig f (cdr items)))))
    
    
    ;(define (for-each-orig f items)
    ;   (if
    ;       (null? items) 
    ;       #t
    ;       ((f (car items))
    ;        (for-each-orig f (cdr items)))))
    
    ; *** ERROR: invalid application: (#<undef> #t) なぜ~
    ; -> if で手続きを 2つする処理はかけない?
    ; -> beginやletでgroupingしてあげるのがいいかも
    
    (for-each-orig 
        (lambda (x)
                (newline)
                (display x))
        (list 57 321 88))
    
    ;57
    ;321
    ;88
    

    2.2.2

    SICP/2.2.2.scm at master · cocodrips/SICP

    Count-leaves
    リスト構造の葉の部分を数えるやつ

    (display "*********2.2.2**********")
    (newline)
    
    (define linked-2-list (cons (list 1 2) (list 3 4)))
    (display linked-2-list) 
    ;((1 2) 3 4)
    (newline)
    
    (define (count-leaves x)
        (cond 
            ((null? x) 0) 
            ((not (pair? x)) 1)
        (else 
            (+ 
                (count-leaves (car x))
                (count-leaves (cdr x))))))
    
    (display (count-leaves linked-2-list))
    (newline)
    ;4
    

    Ex 2.24

    (1 (2 (3 4))) をグラフ化する

    (display "==========Ex 2.24===========")
    (newline)
    (display (list 1 (list 2 (list 3 4))))
    ;  *   
    ; / \
    ;1   *
    ;   / \
    ;   2  *
    ;     / \
    ;    3   4
    (newline)
    

    Ex 2.25

    (7)を取り出す!!

    (display "==========Ex 2.25===========")
    (newline)
    (define l (list 1 3 (list 5 7) 9))
    (display l) (newline)
    (display (cdr (car (cdr (cdr l))))) (newline)
    ;(1 3 (5 7) 9)
    ;(7)
    (define l (list (list 7)))
    (display l) (newline)
    (display (car l)) (newline)
    ;((7))
    ;(7)
    
    (define l (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7)))))))
    (display l) (newline)
    (display (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr l))))))))))))
    (newline)
    ;(1 (2 (3 (4 (5 (6 7))))))
    ;(7)