[Haskell-beginners] Tail recursion problem
Sebastian Arndt
sebarndt at web.de
Sun Feb 20 16:42:28 CET 2011
Hi everyone,
i'm trying to understand tail recursion, but im stuck when it comes to
tail recursion with tuples. Look at the following source code:
module Main(main) where
main = do
putStrLn "tail recursion"
print $ countOdd2 [0..10000000]
{- Tail recursion doesnt work -}
countOdd :: [Int] -> (Int, Int)
countOdd lst = countOdd' lst (0,0)
countOdd' :: [Int] -> (Int, Int) -> (Int, Int)
countOdd' (x:xs) last = if odd x then
countOdd' xs $! (fst last, snd last
+ 1)
else
countOdd' xs $! (fst last + 1, snd
last)
countOdd' [] last = last
{- Working tail recursion -}
countOdd2 :: [Int] -> Int
countOdd2 lst = countOdd2' lst 0
countOdd2' :: [Int] -> Int -> Int
countOdd2' (x:xs) last = if odd x then
countOdd2' xs $! last + 1
else
countOdd2' xs last
countOdd2' [] last = last
The tail recursion in the function *countOdd2 *works fine. But it seems
not to work in *countOdd *because i get a*Stack space overflow *error.
Can anyone rewrite *countOdd *so that it works without a Stack space
overflow?
Thank you.
Cheers
Sebastian Arndt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20110220/50c74ac3/attachment.htm>
More information about the Beginners
mailing list