关于一个数列,最近看到一个有意思的东西,想着记录下来:
初始数列为1,每次把1变为10,0变为1,最后数列是什么样子。
看到这个数列。一时间没有头绪,想着先手推一下:
1;10;101;10110;10110101;……
到了这里,我们首先很容易一眼看出这个数列的长度问题:1,2,3,5,8……
那么是否,这是一个斐波那契数列呢?
这个我们先不去证明,我们首先看看这个数有什么规律:
每次我们把1变为10,0变为1:那么我们的位数变化只跟当前为1的数字有关。
我们当前为1的数字显然有如下转移方程。
设fi为当前1的个数,gi为当前0的个数;
显然我们会有:
f[i] = f[i-1] + g[i -1]
g[i] = f[i -1]
那么,我们就很容易上看出这个规律了:
第i位的长度,显然是f[i] + g[i],而i-1位的长度,显然也是 f[i-1] + g[i-1],那么我们每次差的就是一个f[i-1]而已,那么显然 f[i -1] = f[i-2] + g[i -2] 那么我们就很明显的可以看出:这是第i-2个数列的长度,那么我们这个就相当于i-1个序列的长度加上一个 i-2个序列的长度。
显然,是一个斐波那契数列,证毕。
那么,我们知道了长度的规律,就不得不想继续深入研究,看看到第数字上有什么规律了:
看着看着,又看出了规律:
我们不妨设s[i]为这个数列的排列顺序:
那么在 i > 2时,有:
s[i] = s[i - 1] + s[i -2]
这个加号是string的那种。
那么,如何严谨地证明呢?
这个也比较容易:
我们考虑:有1,10,101,10110,
我们发现如果对齐第一位,那么他们是子序列关系,就是说,后面的包含前面的。这个很容易证明,不多说了。
那么,我们继续考虑,如果 s[i]有t位,s[i + 1]有p位,那么,显然,s[i + 2]有t + p位。而且,s[i]是s[i +1]的一个前缀,s[i +1]是s[i +2]的一个前缀,那么s[i] 也是s[i + 2]的一个前缀。
那么我们s[i +2]的前p个数,就是s[i +1]前t个数转移来的。那么,显然,s[i + 1]的后(p -t )个数,就是转移为s[i + 2]后t个数的数了。
那么,我们就可以试着递归一下,发现,我们最终回到1的时候,1,10.101满足s[i] = s[i -1] + s[i -2]
由此,后面都满足这个规律,证毕。
那么这个数列证明完毕,那么希望有用。
如果哪里有问题,欢迎指正。