# 99 questions/Solutions/6

(Difference between revisions)
 Revision as of 04:53, 28 February 2011 (edit)← Previous diff Revision as of 20:21, 20 May 2011 (edit) (undo) (Add a more efficient palindrome checker)Next diff → Line 19: Line 19: where where input = zip xs (reverse xs) input = zip xs (reverse xs) + + + Here's one that does half as many compares: + + + palindrome :: (Eq a) => [a] -> Bool + palindrome xs = p [] xs xs + where p rev (x:xs) (_:_:ys) = p (x:rev) xs ys + p rev (x:xs) [_] = rev == xs + p rev xs [] = rev == xs

## Revision as of 20:21, 20 May 2011

(*) Find out whether a list is a palindrome. A palindrome can be read forward or backward; e.g. (x a m a x).

```isPalindrome :: (Eq a) => [a] -> Bool
isPalindrome xs = xs == (reverse xs)```
```isPalindrome' []  = True
isPalindrome' [_] = True
isPalindrome' xs  = (head xs) == (last xs) && (isPalindrome' \$ init \$ tail xs)```

Here's one to show it done in a fold just for the fun of it. Do note that it is less efficient then the previous 2 though.

```isPalindrome'' :: (Eq a) => [a] -> Bool
isPalindrome'' xs = foldl (\acc (a,b) -> if a == b then acc else False) True input
where
input = zip xs (reverse xs)```

Here's one that does half as many compares:

```palindrome :: (Eq a) => [a] -> Bool
palindrome xs = p [] xs xs
where p rev (x:xs) (_:_:ys) = p (x:rev) xs ys
p rev (x:xs) [_] = rev == xs
p rev xs [] = rev == xs```