treeduce , , . Wikipedia, Fold ( ), :
fold - -, , , , - , , . , , node , , , . , .
:
List ::= Cons(Object, List)
| Nil
, Cons Nil .
Cons(x,Cons(y,Cons(z,Nil)))
Fn(x,Fn(y,Fn(z,init)))
Nil init ,
Fn(x,Fn(y,Fn(z,init())))
, . :
Tree ::= Node(Tree,Tree)
| Leaf(Object)
, : Node Leaf. :
TreeReduce(nodeFn,leafFn,tree) =
case tree of
Node(left,right) => nodeFn(TreeReduce(nodeFn,leafFn,left),TreeReduce(nodeFn,leafFn,right)
Leaf(object) => leafFn(object)
Common Lisp :
(defun tree-reduce (node-fn leaf-fn tree)
(if (consp tree)
(funcall node-fn
(tree-reduce node-fn leaf-fn (car tree))
(tree-reduce node-fn leaf-fn (cdr tree)))
(funcall leaf-fn
tree)))
(tree-reduce 'cons
(lambda (x)
(if (numberp x) (1+ x) x))
'(1 (2 3) (4 5 6)))
;=> (2 (3 4) (5 6 7))
tree-reduce, , :
(tree-reduce '+
(lambda (x)
(if (null x) 0 x))
'(1 (2) (3 (4) 5)))
;=> 15
, null, - , , cons, , nil , (1 (2. 3) 4. 5), (1 (2 3) 4 (5)) ( (1 (2 3, nil) 4 (5 nil). nil), ).