2008-06-08
■ [scheme] Re:
「30分で初級。10分で中級。」とか書いてあると挑戦したくなりますね。
しかしやってみたら全然うまく行かなくて、Wilikiのヒントを見つつ35分。全然再帰が身についてないことが明らかになりました/(^o^)\
(define result '()) (define (tree->child-parent tree parent) (push! result (cons (car tree) parent)) (for-each (cut tree->child-parent <> (car tree)) (cdr tree))) (tree->child-parent (cdr *tree*) (car *tree)) (print result)
push! か appendが必要らしいので、push!で書いてみた。まず「木の全てのcarを列挙する関数」から始めると考えやすいと思う。
と思ったら、なんかfoldがあればpush!もappendも必要ないらしい。ほんとに?
(define (tree->child-parent2 children parent result) (fold (lambda (node result) (acons (car node) parent (tree->child-parent2 (cdr node) (car node) result))) result children)) (define (main args) (print (tree->child-parent2 (cdr *tree*) (car *tree*) '())))
おお、出来たっぽい。foldに与えた関数の中で再帰するとか、なんかキモい感じですけど(笑)。
「結果がまっすぐなリスト」なので、要素をいっこずつ付け足していけばいい、と。ここではresultというリストにaconsで要素を足していっています。