#haskell #recursion
Вопрос:
Я хочу сравнить целое число (rstart) с целым числом (числом) следующим образом (C-код):
#include <stdio.h>
#include <stdlib.h>
int main (void){
int rstart = 15, rend = 25, number = 629;
while (rstart <= rend){
rstart ;
if (number % rstart == 0){
return number % rstart;
}
}
return number % rstart;
}
Теперь я знаю, как написать что-то подобное на c или python, но я понятия не имею, как это сделать в Haskell.
Я начал со следующего:
dividesRange :: Integer -> Integer -> Integer -> Bool
dividesRange number rstart rend =
Я не знаю, как бы я реализовал цикл while из C в Haskell. Я знаю, что мог бы использовать все операторы if, но, на мой взгляд, это неэффективно. Есть ли простой способ записать это в Haskell?
Ответ №1:
dividesRange :: Integer -> Integer -> Integer -> Bool
dividesRange number rstart rend = go rstart where
go x
| x > rend = False
| otherwise = number `rem` x == 0 || go (x 1)
Как это работает:
- Мы используем вспомогательную функцию
go
. - Базовым случаем является when
x
(rstart), больше, чемrend
. В этом случае мы возвращаем False . - В противном случае мы проверяем, равен ли остаток от
number
деления наx
ноль. Если это так, мы возвращаем True и не повторяем дальше. - В противном случае мы увеличиваем
x
и вызываемgo
снова.
Используя any
, мы можем переписать вышесказанное следующим образом:
dividesRange2 :: Integer -> Integer -> Integer -> Bool
dividesRange2 number rstart rend = any (x -> number `rem` x == 0) [rstart..rend]