写一个函数来计算可能产生的二进制序列数,在这个二进制序列中,两个0之间一定要以1进行分割,也就是说不能出现“00”的情况,只能是“010”,比如 当序列长度为n=3时,所有可能的序列如下:010, 011,101, 110,111,你的函数的输出值应该为5。
Solution 1: cost= O(3^n)
--------------------------------
第i个bit上面的只有0和1种,
如果选择为0, 则i-1,上面的选择只能为1,
如果选择为1, 那么i-1上面的选择既可以为0,也可以为1,
如此从n,一步一步的递归就能得到结果。
int f(int n, int select)
{
if (n == 1)
return 1;
else{
if(select == 0)
return f(n-1, 1);
else{
return f(n-1, 0) + f(n-1, 1);
}
}
}
int main (int n)
{
return f(n,0) + f(n,1);
}
Solution 1: cost= O(n)
--------------------------------
将上面的递归的中间结果记下了,以空间换时间
int f (int n)
{
int res[n][2];
int res[0][0] = 1;
int res[0][1] = 1;
int sum = 0;
for (int i=1; i<n; i++)
{
res[i][0] = res[i-1][1];
res[i][1] = res[i-1][0] + res[i-1][1];
sum += res[i][0] + res[i][1];
}
return sum;
}