Вернуть первую итерацию последовательности из списка в Haskell - PullRequest
0 голосов
/ 19 октября 2019

У меня есть массив последовательностей с бесконечными итерациями (например, [6,6,6,6,6] или [23, 24, 23, 24] или [1, 2, 3, 4, 1, 2,3, 4]) Как мне перебирать каждый такой список в Haskell и возвращать только первую итерацию? В случае приведенных выше примеров: [6];[23, 24];[1, 2, 3, 4]

Спасибо!

Редактировать: Извините, я не был точным. Списки действительно бесконечны. Моя цель - вернуть список аликвотной последовательности заданного целого числа. У меня есть функция, которая возвращает сумму делителей. Я начал рекурсивный вызов с первой суммы и составил список. Это привело к спискам, как [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 ...].

Сначала я хотел решить проблему, взяв первую часть списка, вплоть до второго появления оригинального Int. Но потом меня поразило: с помощью elem проще проверить, существует ли сумма в списке. Если да, вернуть список как есть. В противном случае добавьте сумму и продолжайте.

Редактировать 2: Код, который создает (по крайней мере в моем определении) бесконечный список, представляет собой следующий фрагмент:

aliquot :: (Integral a) => a -> [a]
aliquot 0 = []
aliquot 1 = [1]
aliquot n = n : (aliquot $ sum $ divisors n)

divisors :: (Integral a) => a -> [a]
divisors n = filter ((0 ==) . (n `mod`)) [1 .. (n `div` 2)]

1 Ответ

6 голосов
/ 19 октября 2019

Это невозможно. Рассмотрим следующую последовательность: [1,1,1,1,1,1,1... Похоже, ответ здесь [1], верно? Неправильно. Эта последовательность была на самом деле наибольшим общим множителем (x ^ 17 + 9) и ((x + 1) ^ 17 + 9), которая перестает быть единицами, как только вы попадаете к элементу 8424432925592889329288197322308900672459420460792433rd. Или рассмотрите эту другую последовательность: [1,1,1,1,1,1,1.... Величайшие математики мира не уверены, что ответит за эту последовательность. Это наименьшее число, которое когда-либо достигалось последовательностью Коллатца для каждого начального значения, и хотя мы никогда не находили число, для которого это не 1, мы не смогли фактически доказать, что оно будет 1 для всех чисел.

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