1.进制数模式
考虑n位二进制数,有多少个数中不存在两个相邻的1。例如,3位数中有5个数符合这一要求:000、001、010、100、101。
1、试找出其中的规律
2、请给出完整代码实现(参数输入代码可略)
3、试证明你找到的规律是正确的
思路:
n位的二进制,比如3位:000 001 010 100 101
什么规律呢,假设n位二进制有f(n)种不相邻的组合,
从最左边的位置开始放,可以放0,也可以放1。
如果最左边放0,那么将不影响第二位的放置,从第二位放起,即有f(n-1)种。
如果最左边放1,那么第二位则只能放0,从第三位放起,即有f(n-2)种。
所以f(n)=f(n-1)+f(n-2)种。
另外f(1)=2(因为可以放0或者1),f(2)=3(因为可以是00,01,10)。
问题就解决了。这是很常用的算法思想,各种递推问题,计数问题,通常从单个方向出发,针对不同策略分别
计数。
参考代码:
int fibonacci(int n)
{
int f1 = 2, f2 = 3, fn = 0;
if (n < 0)
{
return fn;
}
else if (n == 1)
{
return f1;
}
else if (n == 2)
{
return f2;
}
else
{
//迭代实现
for (int i = 2; i < n; i++)
{
fn = f1 + f2;
f1 = f2;
f2 = fn;
}
return fn;
}
}