トップ «前の日記(2008-06-06) 最新 次の日記(2008-06-09)» 編集

Route 477



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で要素を足していっています。