[Haskell-cafe] Re: Leaves of a Tree
Chad Scherrer
chad.scherrer at gmail.com
Thu Feb 22 00:57:03 EST 2007
Hi Tom,
Tom Hawkins wrote:
> Folding was my first approach:
>
> leaves :: Tree -> Set Int
> leaves tree = accumLeaves Set.empty tree
>
> accumLeaves :: Set Int -> Tree -> Set Int
> accumLeaves set (Leaf n) = insert n set
> accumLeaves set (Branch l r) = foldl accumLeaves set [l,r]
>
> However, with this approach I quickly ran out of stack space. I found
> this odd, since I thought this program was tail recursive and
> shouldn't be using the stack.
This is a problem of tail recursion and lazy evaluation not playing
nicely. See this page:
http://www.haskell.org/haskellwiki/Stack_overflow
> My next attempt was to use some form of memorization. Since many of
> the branches in my trees are equal, memorization should prevent
> following branches that have already been calculated. My question is,
> what is the best way to transform the original function to incorporate
> memorization?
I think something like this could be done, if there's some invariants
maintained by the data structure. Is there any additional structure
you're imposing beyond that required for the "data" line?
-Chad
More information about the Haskell-Cafe
mailing list