Как проверить, является ли число палиндромом в Clean
Я решаю эту домашнюю работу по чистому языку программирования; Проблема в том, что у нас есть пятизначное число, и мы хотим проверить, является ли оно нечетным палиндромом или нет. Я застрял на этапе деления числа на пять отдельных цифр и выполнения сравнения с исходным числом для проверки палиндрома. С помощью Clean я не могу перебрать число и проверить, остается ли оно одинаковым с обеих сторон, поэтому я ищу альтернативное решение (некоторые математические операции).
Блок кода:
isOddPalindrome :: Int -> Bool
isOddPalindrome a
| isFive a <> 5 = abort("The number should be exactly five digits...")
| (/*==> Here should be the palindrome check <==*/) && (a rem 2 <> 0) = True
| otherwise = False
isFive :: Int -> Int
isFive n
| n / 10 == 0 = 1
= 1 + isFive(n / 10)
Моя идея состоит в том, чтобы взять число, добавить его цифры одну за другой в пустой список, а затем выполнить
2 ответа
В вашем ответе выше нет условия остановки, поэтому это приведет к переполнению стека.
Вы можете попробовать это
numToList :: Int -> [Int]
numToList n
| n < 10 = [n]
= numToList (n/10) ++ [n rem 10]
Start = numToList 12345
а затем, как вы упомянули в ответе, вы можете изменить его с помощью функции «реверс» и проверить, равны ли они.
После нескольких часов попыток выяснить, как рекурсивно добавить цифры нашего номера в пустой список, я сделал следующее:
sepDigits :: Int [Int] -> [Int]
sepDigits n x = sepDigits (n/10) [n rem 10 : x]
Теперь я могу легко проверить, равен ли реверс исходному списку :), тогда число палиндром.