习题3
3-1 递推求解b数列 已知b数列定义:
b1?1,b2?2,bn?3bn?1?bn?2(n?2)
递推求b数列的第20项与前20项之和。 解:
#include
{ int k,n; long b[3000],s; printf(\请输入n: \ scanf(\ b[1]=1;b[2]=2;s=3; for(k=3;k<=n;k++)
{ b[k]=3*b[k-1]-b[k-2];
s+=b[k]; }
printf(\ printf(\ }
3-2 双关系递推数列 集合M定义如下: 1)1?M
2)x?M?2x?1?M,3x?1?M
3)再无别的数属于M
试求集合M元素从小到大排列的第2011个元素与前2011 个元素之和。 解:(1)设计要点
设n个数在数组m中,2x+1与3x+1均作为一个队列,从两队列中选一排头(数值较小者)送入数组m中。所谓“排头”就是队列中尚未选入m的最小的数(下标)。这里用p2表示2x+1这一列的排头的下标,用p3表示3x+1这一列的排头的下标。
if(2*m(p2)<3*m(p3))
{ m(i)=2*m(p2)+1;p2++;} if(2*m(p2)>3*m(p3))
{ m(i)=3*m(p3)+1;p3++;}
特别注意:两队列若出现相等时,给m数组赋值后,两排头都要增1。
if(2*m(p2)==3*m(p3)) { m(i)=2*m(p2)+1;
p2++; p3++; // 为避免重复项,P2,p3均须增1
} (2) 程序设计 // 双关系递推 #include
{int n,p2,p3,i;long s,m[3000]; m[1]=1;s=1;
p2=1;p3=1; // 排头p2,p3赋初值 printf(\请输入n: \ scanf(\ for(i=2;i<=n;i++) if(2*m[p2]<3*m[p3])
{ m[i]=2*m[p2]+1; s+=m[i];
p2++; }
else
{ m[i]=3*m[p3]+1; s+=m[i];
if(2*m[p2]==3*m[p3]) p2++; // 为避免重复项,P2须增1 p3++;
}
printf(\ printf(\ }
3-3 多幂序列
设x,y,z为非负整数,试计算集合
M?{2x,3y,5z|x?0,y?0,z?0}
的元素由小到大排列的多幂序列第n项与前n项之和。 (1)递推算法设计
集合由2的幂、3的幂与5的幂组成,实际上给出的是3个递推关系。 显然,第1项也是最小项为1(当x=y=z=0时)。 从第2项开始,为了实现从小到大排列,设置3个变量a,b,c,a为2的幂,b为3的幂,c为5的幂,显然a,b,c互不相等。
设置k循环(k=2,3,…,n,其中n为键盘输入整数),在k循环外赋初值:a=2;b=3;c=5;s=1;
在k循环中通过比较赋值:
当a
当b 当c 递推过程描述: a=2;b=3;c=5; // 为递推变量a,b,c赋初值 for(k=2;k<=n;k++) { if(a { f[k]=a;a=a*2;} // 用a给f[k]赋值