1.17
已知k阶斐波那契序列的定义为
试编写求k阶斐波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。
分析:我们常见的斐波那契数列应该是二阶的
即,f(n)=f(n-1)+f(n-2) (n为数列中的第几项);所以说几阶就是几个数相加得到一个新的数字。
我们接着观察定义可以知道,如果所求的项比阶数小,即0<n<k-1的情况下,f[n]=0。在n=k-1的情况下,相当于求这个数列的倒数第二项,f[n]=1;
在所求项数比阶数大的时候,即n>=k时,
我们可以得到一个公式:
A: f(n)=f(n-1)+f(n-2)+…+f(n-k)
B: f(n-1)=f(n-2)+f(n-3)+…+f(n-k-1)
A-B:f(n)-f(n-1)=f(n-1)-f(n-k-1)
==》f(n)=2f(n-1)-f(n-k-1)
这样我们就得到一个完整的斐波那契数列的求值方法。
接下来我们要对前k项进行初始化
从第0项到第k-2项都是0,第k-1项的值是1,这个也是根据定义得来的。我们就可以按照公式 f(n)=2f(n-1)-f(n-k-1) 进行计算了。
我们还要注意一个情况,就是求第 负数 项和一阶的情况,不满足定义,直接报错,要求重新输入数据。
最后return f[m]即可。
最后附上题集答案的解法(指针的方法)
1.19试编写算法,计算 i!×2i 的值并存入数组a[0…arrsize-1]的第i-1个分量中(i=1,2,.…,n)。假设计算机中允许的整数最大值为maxint,则当n>arrsize或对某个k(1≤k≤n),使k!×2k >maxint时,应按出错处理。注意选择你认为较好的出错处理方法。
#include<iostream.h>
#include<stdlib.h>
#define MAXINT 65535
#define ArrSize 100
int main() {
int i,k;
int a[ArrSize];
cout<<"Enter k:";
cin>>k;
if(k>ArrSize-1) {
exit(0); //超出数组的长度,按出错处理
}
/***为数组赋值***/
for(i=0; i<=k; i++) {
if(i==0) a[i]=1; //数组的第一个元素为1
else {
if(2*i*a[i-1]>MAXINT) {
exit(0);
} else a[i]=2*i*a[i-1]; //这个可以提高计算效率,相邻的两个数组元素之间存在关系
}
}
for(i=0; i<=k; i++) {
if(a[i]>MAXINT) {
exit(0); //进行大小的比较
} else cout<<a[i]<<" ";
}
return 0;
}
#include<iostream.h>
#include<stdlib.h>
#define N 10
double polynomail(int a[],int i,double x,int n);
int main() {
double x;
int n,i;
int a[N];
cout<<"输入变量的值 x:";
cin>>x;
cout<<"输入多项式的阶次 n:";
cin>>n;
if(n>N-1) exit(0);
cout<<"输入多项式的系数 a[0]--a[n]:";
for(i=0; i<=n; i++) cin>>a[i];
cout<<"The polynomail value is "<<polynomail(a,n,x,n)<<endl;
return 0;
}
double polynomail(int a[],int i,double x,int n) {
if(i>0) return a[n-i]+polynomail(a,i-1,x,n)*x;
else return a[n];
}