Ваше определение последовательности выглядит как последовательность битовых последовательностей:
0 1 10 1001 10010110 ... etc.
t0 t1 t2 t3 t4
но страница википедии определяет его как единственную битовую последовательность:
0 1 1 0 1 ... etc
t0 t1 t2 t3 t4
Это формулировка, на которую ссылаются определения в Википедии. С этим знанием определение рекуррентного отношения, которое вы упомянули, легче понять:
t0 = 0
t2n = tn
t2n + 1 = 1 − tn
На английском языке это можно указать как:
- Нулевой бит равен нулю.
- Для четного ненулевого индекса этот бит совпадает с битом на половине индекса.
- Для нечетного индекса бит равен 1 минус бит на половине (индекс минус один).
Сложная часть идет от индексов 2n и 2n + 1 к нечетным и четным, и понимая, что означает n в каждом случае. Когда это сделано, написать функцию, которая вычисляет * n * -й бит последовательности:
lookupMorse :: Int -> Int
lookupMorse 0 = 0;
lookupMorse n | even n = lookupMorse (div n 2)
| otherwise = 1 - lookupMorse (div (n-1) 2)
Если вы хотите, чтобы вся последовательность, map lookupMorse по неотрицательным целым числам:
morse :: [Int]
morse = map lookupMorse [0..]
Это бесконечная последовательность Туэ-Морса. Чтобы показать это, take
несколько из них, превратить их в строки и объединить полученную последовательность:
>concatMap show $ take 10 morse
"0110100110"
Наконец, если вы хотите использовать определение «последовательности битовых последовательностей», вам нужно сначала удалить некоторые биты из последовательности, а затем взять некоторые. Число для отбрасывания совпадает с числом для взятия, кроме случая с нулевым индексом:
lookupMorseAlternate :: Int -> [Int]
lookupMorseAlternate 0 = take 1 morse
lookupMorseAlternate n = take len $ drop len morse
where
len = 2 ^ (n-1)
Это дает альтернативное определение последовательности:
morseAlternate :: [[Int]]
morseAlternate = map lookupMorseAlternate [0..]
который вы можете использовать следующим образом:
>concatMap show $ lookupMorseAlternate 4
"10010110"
>map (concatMap show) $ take 5 morseAlternate
["0", "1", "10", "1001", "10010110"]