我推了很久,说一下我的想法,不知可不可行,我是这样想的,递推的话首先是去找F(N)与F(N-1)的关系,因为第一位只可能是一(从左往右看)可以先得到F(N)=F(N-1)+.........当第二位是1 的时候,即将F(N)可视为1与F(N-1)结合,对F(N-1)存在合法组合数(比如3的合法组合为100 101 110 111,即2^(3-1)种,而不是F(N-1) 的值,不要搞混淆了)从而此时可得到F(N)=F(N-1)+2^((N-1)-1)+.......从而当第二位为0时,同样可推到+2^(N-2)*1,现在得到的了F(N)相对于F(N-1)增加了1的总值(1*(N-1 位的组合数值)),F(N)=F(N-1)+2^(N-2)+2^((N-1)-1)+.......,,,当第一位是1且第二位是0时,就只需考虑后面N-2位的1的总值了,因为每位都可以为0和1,所以组合和数为2^(N-2)种,如果全是1的话,总值为(N-2)*2^(N-2);因为1和0出现的概率相同,各为50%,所以后(N-2)位总值是(N-2)*2^(N-2)/2,从而可推出F(N)=F(N-1)+2^((N-2)+2^((N-1)-1)+(N-2)*2^(N-2);
化简公式得 F(N)=F(N-1)+(N+2)*2^(N-3)
#include<stdio.h> #include<math.h> int main() { int nCase,n,i,a[21]; scanf("%d",&nCase); while(nCase--) { scanf("%d",&n); a[1]=1;a[2]=3;a[3]=8; for(i=4;i<=n;i++) a[i]=a[i-1]+(i+2)*pow(2,i-3); printf("%d\n",a[n]); } return 0; }