Fibonacci数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
从第三项开始,每项的结果为前两项之和
关于Fibonacci数列的计算不多介绍,详细见如下链接中:
http://www.cnblogs.com/CCBB/archive/2009/04/25/1443441.html
这几天在面试题中看到有很多可以转化为Fibonacci数列的,应用很巧妙,主要列举几题,以后记得要举一反三。
问题1:n位01组合,没有两个1是直接相连的,有多少种排列组合方式
由问题可知:
f(k=1) = 2; 0、1
f(k=2) = 3; 01 、10、 00
f(k=3) = f(k=2) + f(k=1) \\ 在 f(k=2) 后直接填 0 或者在最后一位为1的数列( 这样的数列个数 = f(k=1) )后加1
……
f(n) = f(n-1) + f(n-2)
所以有f(k=n) = Fibonacci(n-2);
问题2:跳台阶问题
有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
典型的Fibonacci数列问题,F(N) = F(N-1) + F(N-2)
上到第10级台阶的走法 = 上到第9级后跨一级 + 上到第8级后跨两级
问题3:对于一个整数,如果是偶数则/2,是奇数则+1,直到=1位置。求经过n次操作变为1的数有多少个?
假设n次操作后变为1的数中偶数有a[N]个,奇数为b[N]个
则有F(N) = a[N] + b[N]
推理n+1次
a[N+1] = a[N] + b[N]
b[N+1] = a[N]
所以
F[N+1] = a[N+1] + b[N+1]
= a[N] + b[N] + a[N]
= F[N] + a[N-1] + b[N-1]
= F[N] + F[N-1]
满足Fibonacci数列,兔子问题也如是说,把成兔看做偶数,把幼兔看做奇数