我正在写作业(CIS194 Haskell 课程)。
我必须将以下递归函数重写为管道函数(没有明显的递归)。
fun2 :: Integer -> Integer
fun2 1 = 0
fun2 n
| even n = n + fun2 ( n ‘div‘ 2 )
| otherwise = fun2 (3 * n + 1)
我的第一次尝试是在这里:
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))
这是一个正常的解决方案还是很奇怪?
我怎样才能fun2
更好地重写?
takeWhile
现在我尝试使用和编写版本iterate
我的第二次尝试:
fun2'' :: Integer -> Integer
fun2'' = sum
. (filter even)
. takeWhile (/=1)
. iterate (\x -> if even x
then x `div` 2
else x * 3 + 1 )
我until
现在版本有点问题。