Как проверить, является ли число палиндромом в 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]

Теперь я могу легко проверить, равен ли реверс исходному списку :), тогда число палиндром.

Другие вопросы по тегам