如何迅速而准确地确立递推关系

一、引言

占卜师的咒语带你来到一个虚空的象限,并准确地看到了你的未来。然而,赋予他这种能力的,其实并不是你不解其意的咒语,而是蕴涵着神秘能量的水晶球。这正 如对于程序员来说,只要掌握了由现在衍化到将来的方法,同样可以随心所欲地写出一种以递推为核心的程序,完成一些在其他人看来是如此困难的事情——困难不 在于程序,而在于思想。

二、一个数值型的递推模型

    某年某月,《幸运52》的“看商品猜价格”环节改变了规则,主持人明确地告诉选手一件特定商品的价格为1到P元之间(P为整数),并给予选手总共G次“猜 价的机会”和L次“猜高的机会”——这就是说,如果选手猜的价格与实际价格不符,那么他失去一次“猜价的机会”,另外如果他猜的价格比实际价格还高,那么 还将失去一次“猜高的机会”。主持人对于选手每次所作出的不正确猜测给出“高了”或“低了”的判断,但是如果选手没能在用光自己全部的“猜价的机会”或者 “猜高的机会”之前猜出商品正确的价格,他就将失去免费获得这件商品的良机。

    节目播出了一段时间以后,主持人渐渐发现对于一组确定的G和L,如果P不高于一个数值的话,一些经过精心准备的选手总能在机会用光之前猜出正确的价格。为了改变这种状况,他想请你帮他计算一下,要把P至少升高到什么程度,才能让最聪明的选手也存在着猜不出正确价格的概率。

    这个问题直接入手处理很快就会陷入混乱,但是只要稍加分析就可以发现,所谓“足够聪明的选手”,就是能用固定的G和L覆盖最多种不同的价格,当P不大于这个种类数的时候,他就可以将猜测的过程完全纳入自己的轨道。具体的过程是:

    对于选手的每一次猜测,只有三种结果:要么猜对、要么猜低、要么猜高。现在假设记选手用(G,L)能覆盖的不同价格种类是F(G,L),那么如果他猜低 了,费掉一次“猜价的机会”,还能在低于这个价格的部分中覆盖F(G-1,L)的不同种价格;如果他猜高了,费掉一次“猜价的机会”以及一次“猜高的机会 ”,还能在高于这个价格的部分中覆盖F(G-1,L-1)的不同种价格;这样,F(G,L)就可以用自身的函数表示如下:

    F(G,L)=F(G-1,L)+F(G-1,L-1)+1    (L、G>=1)

    而在L=0时,有F(G,0)=G;在G=0时,有F(0,L)=0。这样一来,问题的递推过程就清晰了,F(G,L)实际上就是最聪明的选手存在必胜策略的P上限。

    在这个例子中,现在的问题分解为多个将来的问题,而且将来的问题比现在的问题规模小,这样就可以将问题的全过程正向地逐渐展开,从而得到需要的解决方案。

三、一个真假型的递推模型

    Adam和Eve两个人进行一项游戏。首先,随机地从1900年1月1日到2001年11月4日之间选定一个日期,然后Adam和Eve轮流地执行以下的 步骤(Adam首先进行):将日期推进到当前日期的下一天或者是下一个月的同一天(如果下个月没有同一天的话,则只能推进到当前日期的下一天,比如从任一 年的1月20日可以推进到1月21日或者2月20日,但是从1月31日只能推进到2月1日)。首先将日期精确地推进到2001年11月4日的人获胜,如果 其中一人将日期推进到2001年11月4日以后,他的对手同样会赢得胜利。现在的问题是,对于一个给定的起始日期,先手的Adam是否存在着必胜策略呢?

    对于这个问题,如果直接地建立博弈树,虽然可以得到正确的结果,但由于给定时间的跨度太大,程序运行上的时间消耗将会十分的巨大。本题的特点在于,我们只用判断真假而不必深入具体的分支过程,因此可以从容地利用真假的性质得出下面的结论:

    如果一个日期对于Adam来说存在着必胜策略,他可以选择推进到的日期中必然存在着至少一个日期对于Eve来说是不存在必胜策略的。具体地说,如果一个日 期只能推进到下一天,那么如果在这个“下一天”起手的玩家不存在必胜策略,那么给定日期便是存在必胜策略的。而如果一个日期可以推进到两个不同的日期,那 么除非在这两个日期起手的玩家都存在必胜策略,否则给定日期便是存在必胜策略的。如果考虑到这点,只要对边界处理稍加注意,就可以轻松地解决这个表面看起 来错综复杂的问题。

    在上面的例子中,早先得到的对于一个或两个日期的真假值可以联合起来推出对于另一个日期真假值,如此则可以逐渐扩大我们的“已知”范围,而以此来将更多的未知变为已知,这种过程无论从逻辑上还是从效率上都充分发挥了递推的优势。

四、问题局部递推后组合出新整体的递推模型

    以下这个问题的原型是2001年ACM竞赛北京赛区的一道题目:

    假设有C(C<=100)种不同颜色的巧克力,现在执行以下的步骤M次(M<=1000000):等概率随机选择一种颜色的巧克力放到桌子上,如果桌子上存在与该巧克力相同颜色的巧克力则一起拿掉它们。

    现在的问题是这个过程之后,桌子上恰好留有N(N<=1000000)块巧克力的概率是多少?

    这个问题首先可以得出一些可以加快处理速度的结论,比如:每种颜色的巧克力最多只有一块留在桌子上,因此不可能出现N>C的情况;另外,由于拿掉巧 克力时只能两个两个拿,因此不可能出现N和M的奇偶性不同的情况。但是,这些都不涉及问题的实质,问题的主要过程可以有两种解决方案:

    1、用概率算法随机模拟,这种方案思路简单,程序易于编写,而且在试验次数足够多的情况下可以得到近似程度很好的解,但它对时间的消耗与近似程度是成比例增长的,因此得出一定精度下的准确解需要耗费大量的时间。

    2、采用递推的过程逐步得出结论:

    记P(M,N)为步骤执行M次后桌面上剩余N块巧克力的概率(根据上面的结论,在这部分讨论中,限定N<=C),那么在M=1时,显然地有P(1,1)=1,P(1,X)=0(X不为1)。

    第M+1次的桌面状况概率分布可以由第M次的桌面状况概率分布间接获得:

    (1)对于P(M+1,0)的值:仅当执行M次步骤后桌面上留下一块巧克力,而且第M+1次放到桌上的又恰恰是同色巧克力的时候可以使执行M+1次步骤后桌面清空。因此有P(M+1,0)=P(M,1)/C。

    (2)对于P(M+1,C)的值:仅当执行M次步骤后桌面上留下C-1块巧克力,而且第M+1次放到桌上的又恰恰是与这C-1块巧克力均不同色的巧克力的 时候可以使执行M+1次步骤后桌面上剩余C块巧克力。根据前面的结论,之前留在桌面上的C-1块巧克力覆盖了C-1种颜色,因此取出不同色巧克力的概率为 1/C。由此得出,P(M+1,C)=P(M,C-1)/C。

    (3)对于不等于0和C的X,P(M+1,X)的值:

    当执行M次步骤后桌面上留下X-1块巧克力,而且第M+1次放到桌上的又是与这X-1块巧克力均不同色的巧克力的时候可以使执行M+1次步骤后桌面上恰有 X块巧克力。根据前面的结论,之前留在桌面上的X-1块巧克力覆盖了X-1种颜色,因此取出不同色巧克力的概率为(C+1-X)/C。

    当执行M次步骤后桌面上留下X+1块巧克力,而且第M+1次放到桌上的又是与这X+1块巧克力中任一块同色的巧克力的时候也同样可以使执行M+1次步骤后 桌面上恰有X块巧克力。根据前面的结论,之前留在桌面上的X+1块巧克力覆盖了X+1种颜色,因此取出与其中任一块同色的巧克力的概率为(X+1)/C。

    结合上面两种状况推出,P(M+1,X)=P(M,X-1)*(C+1-X)/C+P(M,X+1)*(X+1)/C。

    综合(1)(2)(3),我们就可以由第执行M次步骤后桌面上剩余巧克力数量的概率分布推得M+1次后的状况。如果把概论分布当作一个整体,我们在递推的 过程中实际上是先将整体拆成部分,各个部分之间相互组合推出新整体的各部分,然后再组合出新的整体。运用这种递推方法,并且在求解的过程中不断与需要的精 度做比较,我们可以很快地找到精确度很高的解,速度上会大大优于用概率模拟的方法。

五、结语

    就如同编程本身,递推既是科学,也是艺术。熟练而巧妙地运用递推思维,可以将很多问题化繁为简,笔者在这篇文章提到的例子都不算是很复杂,只是借此说明一 下递推的特点,更多精妙的运用技巧还需要读者自己体会。其实,递推的空间虽然宽广,但原理并不深奥,只要注意分析问题的实质,准确地判断各种量的对应关 系,就能很快地找到解决这种问题的捷径。希望大家在此都能有自己的收获和提高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值