I'm writing my homework (CIS194 Haskell course).
I must rewrite the following recursive function to pipeline functions (without obvious recursion).
fun2 :: Integer -> Integer
fun2 1 = 0
fun2 n
| even n = n + fun2 ( n ‘div‘ 2 )
| otherwise = fun2 (3 * n + 1)
My first try is here:
fun2''' = sum
. (filter (even))
. unfoldr (\x -> if (even x)
then Just (x, x `div` 2)
else if (x==1) then Nothing
else Just (x, x * 3 + 1))
Is this a normal solution or is it weird?
And how can I rewrite fun2
better?
Now i try write version with takeWhile
and iterate
my 2nd try:
fun2'' :: Integer -> Integer
fun2'' = sum
. (filter even)
. takeWhile (/=1)
. iterate (\x -> if even x
then x `div` 2
else x * 3 + 1 )
i have little problems with until
version now.