<< 「エス」読了 | top | SICPメモ(10) 2.3.2記号微分 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

SICPメモ(9) 問題2.17 & 問題2.18

2.2節でlistというものが出てきた。
consでペアを順に繋いだものらしい。

(list 1 2 3 4)
(1 2 3 4)

C言語の配列のように使うには取り扱うための手続きが必要だ。
リストの最後の要素を返す手続きを定義せよ、というのが問題2.17。
要素を取り出すにはcdrを何度か作用させてcarを作用させるのが基本。
例えば(1 2 3 4)で3を取り出したければcdrを2回作用させてcarで取り出せる。
リストが空かどうかはnull?で調べられる。

次のようにしてみた。

(define (last-pair items)
  (define (last-pair-iter item0 item1)
  (cond
    ((null? item1) item0)
    (else (last-pair-iter item1 (cdr item1)))
    )
  )
  (last-pair-iter items (cdr items))
 
  )

(last-pair (list 1 2 3 4 5 6))
(6)

リストが空になるまでcdrを作用させていく。常に作用させる前のリストを保持しておき、空になったとき直前のリストを返せばそれが最後の要素だ。
他の人の解答を見てみるともっと効率のいい方法があるな。面白い。

問題2.18はリストの要素を逆順のリストに変換して出力せよ、というもの。

(define (myreverse items)
  (define (myreverse-iter items r-items)
    (cond
      ((null? items) r-items)
      (else (myreverse-iter (cdr items) (cons (car items) r-items)))
      )
  )
  (myreverse-iter items (list))
  )

(myreverse (list 1 2 3 4))
(4 3 2 1)

SICPだと空の要素をnilであらわしてたけどDrRacketだとnilがないようなので(list)で代用。

すぐに飽きると思ったけど以外に長続きしているSICP。問題がパズルみたいでおもしろい。
ジャジャガッチ | LISP | 21:19 | comments(0) | trackbacks(0) |

スポンサーサイト

スポンサードリンク | - | 21:19 | - | - |
Comment









Trackback
URL:

07
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH