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で要素を足していっています。
[ツッコミを入れる]