Вхождение в список делителей в Haskell

Мне нравится - Стена и строгие прототипы, а также определения неявной функции. Ошибки на тех могут быть очень полезными. Существует также-Wextra, который возьмет весь виды из вещей как вещи, Вы намеревались быть условными выражениями, но случайно записали как операторы:

if (something);
   classic_way_to_leak_memory();

В подобных Unix системах необходимо повиноваться огибающим предпочтениям пользователя.. таким образом, что они видят и отчет мог бы совершенно отличаться, чем, в чем Вы нуждаетесь:)

я - также тип, каламбурящий злодей, таким образом, я склонен устанавливать-Fno-strict-aliasing также, если пользователь не хочет его. Безопасное управление памятью в классике C трудно выполнить иначе.

11
задан iCodez 22 January 2015 в 17:53
поделиться

1 ответ

Вам просто нужна отдельная переменная.

Prelude> let divisors n = [x | x <- [1..(n-1)], n `rem` x == 0]
Prelude> divisors 20
[1,2,4,5,10]
Prelude> divisors 30
[1,2,3,5,6,10,15]

Теперь, если вы хотите сделать его немного более эффективным, мы уже знаем, что делитель не будет больше половины n , и мы знаем, что 1 является делителем всего. И, давайте продолжим и сделаем его немного более Haskell-y для загрузки, избегая понимания списка:

Prelude> let divisors n = 1 : filter ((==0) . rem n) [2 .. n `div` 2]
Prelude> divisors 20
[1,2,4,5,10]
Prelude> divisors 30
[1,2,3,5,6,10,15]
Prelude> divisors 31
[1]
18
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: