2013-06-22 7 views
3

Я стараюсь writemy самостоятельно «пройти через дерево» функции, но я новичок в FPпрогулка по дереву функционально

Я написал эти функции, и она работает хорошо, но это выглядит некрасиво

(defrecord Tree [value left right]) 
(defn depth_walk_tree 
    [tree functor] 
     (let [item (functor (:value tree))] 
      (let [leftlst 
        (if (:left tree) 
         (cons item (depth_walk_tree (:left tree) functor)) 
         (list item)) 
       ] 
        (if (:right tree) 
         (concat 
          leftlst 
          (depth_walk_tree (:right tree) functor)) 
         leftlst)))) 

(def tree (Tree. 1 (Tree. 2 (Tree. 0 nil nil) (Tree. 90 nil nil)) (Tree. 3 nil (Tree. 10 nil nil)))) 
    (println (depth_walk_tree tree #(+ % 1))) 

Программы ответ

(2 3 1 91 4 11); is Ok 

Может кто-нибудь посоветовать мне, как сделать это красота?

PS Извините за мои письменные ошибки. Английский язык не на моем родном языке.

ответ

3

Это выглядит немного более функциональным, ИМХО:

(defn depth_walk_tree [tree functor] 
    (concat 
    (list (functor (:value tree))) 
    (if (:left tree) (depth_walk_tree (:left tree) functor)) 
    (if (:right tree) (depth_walk_tree (:right tree) functor)))) 

И он сохраняет первоначальный результат, тоже:

(depth_walk_tree tree inc) 
=> (2 3 1 91 4 11) 
+1

так чисто! Я не знал, что concat передает «ноль». Спасибо. –

+1

Функциональное программирование - все о простоте и элегантности :) –

+0

Как бы вы избежали переполнения стека, вызванного рекурсией без хвоста? –

Смежные вопросы