递归

来源:互联网 发布:风电 知乎 编辑:程序博客网 时间:2024/05/21 13:20


1.有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。

思路:a蜂房只能爬到a+1蜂http://write.blog.csdn.net/postedit/21884833房或者a+2蜂房,反过来说b蜂房是由b-1蜂房和b-2蜂房爬过来的。因此b蜂房的路线数就是b-1的路线数加上b-2的路线数,设s[b-a]=x,x为a到b的方案数,如果b-a==1,那可以简单知道方案数为1,如果b-a==2,方案数为2,按照递归思路方程 s[i]=s[i-1]+s[i-2],最后答案s[b-a]。


2.有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.

思路:可以简单的知道格子为1、2、3的方案数分别为3、6、6。接着考虑第4个,第4个的方案数受第2个和第3个的影响,比如第3个和第1个颜色相同,或者不同。如果三者颜色不同,那么第4个的方案数就是第3个的方案数,比如说红黄蓝,那么第4个的颜色就只能是黄。如果说第3个和第1个颜色相同,比如说红黄红,那么第4个颜色就是黄或者蓝,综上,那么一开始的想法是第3个方案数乘3就是第4个方案数。这样是错误的,错在第2种情况,不是第3个方案数乘2,而是第2个方案数乘2。为什么呢?因为在第种情况下,第3个格子的颜色是被定死的,只能和第1个颜色相同,所以方案数肯定是小于第3个的方案数,可以这样想,考虑只有2个格子,比如说红黄,不考虑第3个是什么颜色,因为被定死了,然后第4个格子的颜色是黄或者蓝,因此是第2个方案数乘2。

简单总结下就是,第i个方案数是i-1方案数加上i-2方案数*2。

3.在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

思路:这题枚举下答案可能就会发现了,我用竖着的骨牌用1表示,横着的骨牌用2表示,那么枚举下。

如果n=1 答案为1

如果n=2 答案为11、2

如果n=3 答案为111、12、21

如果n=4 答案为1111、112、211、121、22

我们可以发现,n=2的答案都加上2再加上n=3的答案都加上1就是n=4的答案,这样就可以想到递归思想。

我们可以试想一下n答案的来源,因为递归的题目都是这样的思想,当前状态都是来源于之间状态的所有情况之和。考虑一下n=4的答案,如果我们将n-1,那么1111、211、121这3个是可以存在的,如果我们将n-2,那么11、11、2、2(重复)这2个是可以存在的。如果我们将n-3,那么1这1个是存在的。那么我们可能会想答案应该是n=1、n=2、n=3的情况总和。但是n=1的情况已经纳入n=3的情况了,n=1时,让它开一列格子,也就是n+1,那么它的方案数将纳入n=2,让它开两列格子,也就是n+2,那么他的方案数将纳入n=3,让它开三列格子,也就是n+3,那么他的方案数将纳入n=4?这样就错了,开三列格子的时候,如果将n=1的方案数纳入n=4,那么必然会跟n=2开两列格子和n=3开一列格子的方案数重复。可以仔细看一下上方的枚举答案,如果n=1开三列,那么就有1111、112、211、121、22这5种情况,和n=2开两列n=3开一列是相同的。但是可能又会想,如果n=1开三列可以达到n=4的状态,那不是也可以递归?为什么非要n=2开两列+n3开一列达到n=4的状态?开三列无非就是在后面加上111、12、21,我们可以发现缺少了22、211这2个答案,至于开四列行不行我就不去讨论了。

简单总结就是n的方案数是n-1的方案数+n-2的方案数。


0 0
原创粉丝点击