Модульная арифметика в Хаскеле - PullRequest
2 голосов
/ 20 мая 2011

Как мне сделать функцию, чтобы x имел диапазон значений от x=0 до x=19, и если значение x превышает 19 или меньше нуля, как я могу заставить его обернуться вокруг

От: x=20, x=21, x=22 и x=(-1), x=(-2), x=(-3)

Для того, чтобы: x=0, x=1, x=2 и x=19, x=18, x=17 соответственно ?

Я слышал о модульной арифметике, которая, по-видимому, является способом, которым я должен иметь дело с ней.

Ответы [ 3 ]

6 голосов
/ 20 мая 2011

Обычно вы используете встроенные функции mod и rem, но я предполагаю, что они запрещены для домашней работы. Таким образом, вы можете написать свою собственную функцию, например,

mod20 x | x < 0 = ...
        | x > 19 = ...
        | otherwise = x

Есть несколько вещей, которые вы можете попытаться заполнить в ... с. Одним из самых простых является повторное сложение или вычитание, но я не хочу портить все веселье.

Если у вас есть эта функция, вы можете «перемасштабировать» значения после каждой «обычной» арифметической операции, например, mod20 (12 + 17).

2 голосов
/ 20 мая 2011

Попробуйте использовать функцию мода:

(-5) `mod` 20 ==> 15
5 `mod` 20 ==> 5
20 `mod` 20 ==> 0
25 `mod` 20 ==> 5

См. Также Википедия по теме.

1 голос
/ 20 мая 2011

Используйте

x `mod` 20

(Это заполнитель для ответа 30 символов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...