一个递推关系的解答

题目:所有N位二进制序列中有多少个序列包含两个连续的‘1’?

解题过程:(注:其中有一个错误过程,是为了记录自己的错误思路,给自己看的,希望不要混淆读者)

由于前两天刚看过一个类似的题目的求解过程,立即便想到了通过在N-1序列的基础上添加一位二进制位的方式来推知答案。

设N位序列中包含两个连续‘1’的序列个数为M[N](N>=2)。

把N-1位的所有序列分为两部分:1、包含两个连续的‘1’。2、不包含两个连续的‘1’。

对于第一种情况是很容易理解的,如果N-1序列已经包含了两个连续的‘1’,则无论在结尾添加什么字符,所得到的序列还是符合要求的,而这样得到的序列有2M[N-1]个。

现在分析第二种情况。如果N-1序列不包含两个连续的‘1’,则很容易想到在结尾为‘1’的序列后再添加一个‘1’,就得到了想要的序列。那结尾为‘1’的N-1序列有多少个呢?

显然有2^(N-2)个,再减去其中包含两个连续‘1’的序列M[N-2]个。

则M[N] = 2M[N-1] + 2^(N-2)– M[N- 2].

这样得到的答案总比实际数字要多一些,说明公式有错。仔细观察推导过程,发现在分析第二种情况时有重复:结尾为‘1’的序列可能也在情况1里被统计过了,也就是说结尾为‘1’的序列本身可能就包含两个连续的‘1’。

毛病找到了,就对症下药。在结尾为“01”的且不包含两个连续的‘1’的序列后添加一个‘1’,就可以消除之前的重复统计现象。而这样的序列数与不包含两个连续‘1’的N-3的序列数是一致的。N-3序列共有2^(N-3)个,其中M[N-3]个包含“11”。

现在我们的答案是M[N]= 2M[N-1] + 2^(N-3) – M[N-3]。要得到完整的M,则需要初始化前三个元素:M[2] = 1, M[3] = 3, M[4] = 8。

其实通过另一个方向便很容易得到“不包含两个连续的‘1’的序列数”。其实就是斐波那契数列的一部分。可以表达为F[N] = F[N-1] + F[N-2]。用序列总数减去F[N]就得到了M[N],即:M[N] = 2^N – F[N]。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值