Re: Recursion vs Iteration
- From
- Vitaly Lugovsky (2:5080/1003)
- To
- Oleg I. Khovayko
- Date
- 2003-01-17T23:21:25Z
- Area
- RU.ALGORITHMS
From: Vitaly Lugovsky <vsl@ontil.ihep.su>
Oleg I. Khovayko <olegh@ncbi.nlm.nih.gov> wrote:
> let rec tfindl f nl =
> let rec nxtlyr = function
> hd :: tl ->
> (match hd with
> Tnode(v,l,r) -> if f v than raise (Found(v)) else
> l::r::(nxtlyr tl) | Tnone -> nxtlyr tl
> )
> | [] -> []
> in tfindl f (nxtlyr nl)
А вот теперь поизвращаемся. Дабы мощщу и универсальность рекурсии показать,
да и просто заради маразма.
Предположим, что следующие функции у нас и так уже есть (по крайней мере
у меня они многа-многа где используются).
let rec dolist f l =
let ll = f l in
match ll with [] -> [] | _ -> dolist f ll
let s x = x
Так как мы работаем с деревьями, то и такая вся из себя generic функция
тоже есть, и много где ещё нужна:
let dotree f n fl fr t =
match t with Tnone -> n |
Tnode(v,l,r) -> f v (fl l) (fr r)
Тогда, послойный поиск получится таким:
let tfind2 f0 l0 =
dolist (fun nl -> List.flatten (List.map (dotree
(fun v l r -> f0 v; [l;r]) [] s s) nl)) [l0]
IMHO, заметно читабельнее, чем предыдущий паскалеобразный вариант...
--- ifmail v.2.15dev5
* Origin: (http://news.cca.usart.ru/) USURT's FidoNET<-> (2:5080/1003@fidonet)