设为首页 加入收藏

TOP

2.6.2 组织游行队伍
2014-03-11 13:02:46 来源: 作者: 【 】 浏览:83
Tags:2.6.2 组织 游行 队伍

2.6.2  组织游行队伍

假定您负责组织7月4日的游行,该游行队伍由一行乐队和彩车组成。去年,相邻乐队之间有不适当竞争。为避免此类问题,组织者要求任何两个乐队都不要相邻。要组织长为n的游行队伍,有多少种方法?

假设至少可从n个乐队和n辆彩车中选择。在计算组织游行队伍的方法数目时,将"乐队-彩车"与"彩车-乐队"序列看成不同队伍,视为两种方法。

队伍以彩车或乐队结尾。组织队伍的方法数仅是各类型队伍的数目之和。也就是说,令:

P(n)是组织长为n的队伍的方法数

F(n)是长为n、以彩车结尾的队伍的方法数

B(n)是长为n、以乐队结尾的队伍的方法数

P(n) = F(n) + B(n)

先分析F(n)。要得到一个长为n、以彩车结尾的游行队伍,只需要将一辆彩车放在长为n-1的任何可接受队伍的末尾。因此,长为n、以彩车结尾的可接受队伍数目正好等于长为n-1的可接受队伍的总数,即

F(n) = P(n-1)

注释:长为n、以彩车结尾的可接受队伍的数目

再看B(n)。只有倒数第二个单元为彩车时,队伍才能以乐队结尾(如果倒数第二个单元为乐队,则两个乐队就会相邻)。这样,组织长为n、以乐队结尾的可接受队伍的唯一方式是:先组织长为n-1、以彩车结尾的队伍,再在末尾加上乐队。因此,长为n、以乐队结尾的可接受队伍数目完全等于长为n-1、以彩车结尾的可接受队伍数目。即

B(n) = F(n-1)

由F(n) = P(n-1),可知:

B(n) = P(n-2)

注释:长为n、以乐队结尾的可接受队伍的数目

这样,分别按更小问题P(n-1)和P(n-2)解决F(n)和B(n)。由

P(n) = F(n) + B(n)

P(n) = P(n-1) + P(n-2)

注释:长为n的可接受队伍的数目

这种递归关系形式与兔子繁殖问题的解决方案相同。

与兔子问题一样,此处需要两个基例,因为递归关系根据两个更小问题定义了一个问题。与兔子问题一样,可以选取n=1和n=2为基例。虽然二者都为基例选取了相同的数值n,但是二者基例的值并不相同。换句话说,没有理由认为rabbit(1)=P(1),rabbit(2)=P(2)。

注释:两个基例是必需的,因为存在两个更小的问题

稍微思考一下,即可求得游行问题的基例。

P(1) = 2 (游行队伍长为1,包括:乐队、彩车)

P(2) = 3 (游行队伍长为2,包括:彩车-彩车、彩车-乐队、乐队-彩车)

总之,该问题的解决方案为:

P(1) = 2

P(2) = 3

P(n) = P(n-1) + P(n-2)     若n > 2

注释:递归解决方案

本例说明了递归的两个要点:

有时候可以将问题分成不同情况来解决。例如,以彩车结尾的队伍和以乐队结尾的队伍。

基例的值相当重要。尽管P和rabbit的递归关系相同,但由于基例(n=1或n=2)值不同,导致当n增大时,P(n)与rabbit(n)的值不同。例如,rabbit(20)=6 765,而P(20)=17 711。n值越大,差异越大。其原因请自行分析。
 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.6.1 Fibonacci数列(兔子繁殖) 下一篇1.1.2 面向对象解决方案的特征

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)