Skip to content

Instantly share code, notes, and snippets.

@alexpw
Last active August 29, 2015 14:09
Show Gist options
  • Save alexpw/c229ab22a60c3ac4a5db to your computer and use it in GitHub Desktop.
Save alexpw/c229ab22a60c3ac4a5db to your computer and use it in GitHub Desktop.
ch1 hw - std and tail-call recursion
-- module cis194.ch1 where
-- std
toDigits' :: Integer -> [Integer]
toDigits' = reverse . f
where
f 0 = []
f x = (x `rem` 10) : f (x `div` 10)
-- tail-call
toDigits :: Integer -> [Integer]
toDigits = f []
where
f rs 0 = rs
f rs x = f (x `rem` 10 : rs) (x `div` 10)
-- std
toDigitsRev' :: Integer -> [Integer]
toDigitsRev' 0 = []
toDigitsRev' x = (x `rem` 10) : toDigitsRev' (x `div` 10)
-- tail-call
toDigitsRev :: Integer -> [Integer]
toDigitsRev = f []
where
f rs 0 = rs
f rs x = f (x `rem` 10 : rs) (x `div` 10)
-- std
doubleEveryOther' :: [Integer] -> [Integer]
doubleEveryOther' = reverse . f . reverse
where
f :: [Integer] -> [Integer]
f [] = []
f (x:[]) = [x]
f (x:y:xs) = x : (y + y) : f xs
-- tail-call
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther = f [] . reverse
where
f rs [] = rs
f rs (x:[]) = x : rs
f rs (x:y:xs) = f (y + y : x : rs) xs
-- std
sumDigits' :: [Integer] -> Integer
sumDigits' [] = 0
sumDigits' (x:xs) = sum (toDigits x) + sumDigits' xs
-- tail-call
sumDigits :: [Integer] -> Integer
sumDigits = f 0
where
f r [] = r
f r (x:xs) = f (r + sum (toDigits x)) xs
validate :: Integer -> Bool
validate = (== 0) . (`mod` 10) . sumDigits . doubleEveryOther . toDigits
type Peg = String
type Move = (Peg, Peg)
hanoi :: Integer -> Peg -> Peg -> Peg -> [Move]
hanoi 0 _ _ _ = []
hanoi n src dest tmp = (hanoi (n - 1) src tmp dest) ++
[(src, dest)] ++
(hanoi (n - 1) tmp dest src)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment