Ex.2.32
うーん。これは単に難しく考え過ぎじゃないかな。
http://d.hatena.ne.jp/yukichanko/20091011/1255280942
#というかerlang liteを支える立役者が弱者とか軽々しく言っちゃいけませぬっ。
ある集合Aのベキ集合をPとすると、Aにある1要素αを足した集合 A'のベキ集合 P'は
とかなる、というやつ。
(define (subsets s) (if (null? s) (list '()) (let ((rest (subsets (cdr s)))) (append rest (map (lambda (lst) (cons (car s) lst)) ; ... (1) rest)))))
要するに、 P'は Pと、Pに要素 αを追加した集合の和集合。(1)のところはαを追加した集合を作ってて、それと rest = Aをくっつけてる。という仕組みっす。
でも実は最初自分で考えてみた時は非情にバカな事を考えていて、こんなにエレガントじゃなかった・・・
(define (dame-subset s) (if (null? s) 'end (list (cons (car s) (dame-subset (cdr s))) (dame-subset (cdr s)))))
として2分treeをこさえておいてからトラバースして行って endが出るたびにfinalなリストに足していくという方法。ダサイ過ぎorz
imperativeは面倒なのでカット。