Я хочу определить Thue-Morse Sequence (или fair-sharing sequence) в терминах начального элемента 0
и правила, определяющие следующий раздел списка в терминах всего списка до этой точки , т.е.Определение списка путем повторной записи/итерации
fair 0 = [0]
--fair 1 = [0,1]
--fair 2 = [0,1,1,0]
--fair 3 = [0,1,1,0,1,0,0,1]
fair n = fair (n - 1) ++ map (1-) (fair (n - 1))
Это прекрасно работает для создания списка до любой заранее определенной длины, но это, кажется неэффективным, не просто определить весь список сразу, и использовать take
если мне нужно заранее определенную сумму.
Моя первая попытка определить весь список: fair = 0 : map (1-) fair
, но, разумеется, это заполняет список, как он есть, поэтому он никогда не должен (нужно) повторно вводить список (и возвращает [0,1,0,1,0,1...]
). То, что я хочу, - это способ определить список, так что, когда он достигнет еще не определенного элемента в списке, он определяет следующий «кусок», повторно введя список только до этой точки (а не вычисления ' чеканка»новых значения, как они производятся), так что шаги в вычислении списка будут сродни эта процедура:
- начинается с первоначальным списком,
[0]
- карту
(1-)
поверх существующего список, производя[1]
- добавить в существующий список, производящий
[0,1]
- карта
(1-)
поверх существующего списка, производя[1,0]
- Append это к существующему списку, производя
[0,1,1,0]
- карту
(1-)
поверх существующего списка, производя[1,0,0,1]
- Append это к существующему списку, производя
[0,1,1,0,1,0,0,1]
Wikipedia article У меня есть ссылка helpful gif, чтобы проиллюстрировать этот процесс.
Как я полагаю, вы можете видеть, это будет продолжаться бесконечно, так как нужны новые элементы. Тем не менее, я не могу для жизни меня найти способ успешно кодировать это в рекурсивной функции.
Я попытался
reenter f xs = reenter f (xs ++ map f xs)
fair = reenter (1-) [0]
Но в то время как логика кажется правильной, она висит, не производя ничего, вероятно, из-за непосредственный рекурсивный вызов (хотя я думал, что ленива оценка Хаскеля может позаботиться о том, что, несмотря на это время довольно сложный случай).