Look-and-say sequence(看读序列)

在数学上,Look-and-say sequence为一整数序列,举例如下:

  1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, ...

序列的生成过程如下(后一个数为前一个数的数字个数+数字本身的序列):

  1 读为 1个1,所以后一个数记为 11

  11 读为 2个1,所以后一个数记为 21

  21 读为 1个2,1个1,所以后一个数记为 1211

  1211 读为 1个1,1个2,2个1,所以后一个数记为 111221

  111221 读为 3个1,2个2,1个1,所以后一个数记为 312211

  ...

假设 d为 0-9的数字,建立Look-and-say 序列,d将一直位于序列中每个数的末尾,如下所示:

  d, 1d, 111d, 311d, 13211d, 111312211d, 31131122211d, …

如果d = 3, Ilan Vardi 叫这个序列为 Conway sequence(康威序列)。

序列拥有以下特点:

  1、序列增长方式具有不确定性,除了 degenerate sequence(退化序列?):22,22,22,22,22,...;

  2、序列中不会出现大于3的数,除非起始数>3;

  3、康威的宇宙定理一个序列,最终分裂为一个由“原子成分”组成的序列,这些原子成分就不会再他们的邻居产生任何关系,共有92个仅仅包含1,2,3的原子成分,其中约翰·康威的天然化学元素命名这就是以后约翰-康威命名的自然化学元素。也有两个“超铀”元素,包括除1,2和3以为的数字。

  4、每一级长度最终增长约30%。假设Ln为序列中第N个数字的长度,那么    

  其中\lambda = 1.303577269\ldots为一71位的代数,被称为康威常数。Conway(康威)证明了这一事实,这也适用于任何其他不是22的整数启动的序列。

  下面给出Python的计算公式,来生成序列

  

 1 #python3
2 def look_and_say(member):
3 while True:
4 yield member
5 breakpoints = ([0] + [i for i in range(1, len(member))
6 if member[i - 1] != member[i]]
7 + [len(member)])
8 groups = [member[breakpoints[i - 1]:breakpoints[i]]
9 for i in range(1, len(breakpoints))]
10 member = ''.join(str(len(group)) + group[0] for group in groups)
11
12 # Print the 10-element sequence beginning with "1"
13 sequence = look_and_say("1")
14 for i in range(10):
15 print(next(sequence))#python2应为print sequence.next()

  如果使用正则表达式可以,简化代码:  

1 import re
2 def describe(s):
3 return "".join([str(len(m.group(0))) + m.group(1)
4 for m in re.finditer(r"(\d)\1*", s)])
5
6 s = "1"
7 for dummy in range(10):
8 s = describe(s)
9 print(s)

 

    

posted @ 2012-04-04 23:22  Goodpy  阅读(2269)  评论(0编辑  收藏  举报