数据结构题集第一章(严蔚敏)

1.17
已知k阶斐波那契序列的定义为
数据结构题集第一章(严蔚敏)_第1张图片
试编写求k阶斐波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。
分析:我们常见的斐波那契数列应该是二阶的
即,f(n)=f(n-1)+f(n-2) (n为数列中的第几项);所以说几阶就是几个数相加得到一个新的数字。
我们接着观察定义可以知道,如果所求的项比阶数小,即0的情况下,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]即可。
最后附上题集答案的解法(指针的方法)
数据结构题集第一章(严蔚敏)_第2张图片
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
#include
#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<

数据结构题集第一章(严蔚敏)_第3张图片

#include
#include
#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 "<0) return a[n-i]+polynomail(a,i-1,x,n)*x;
	else return a[n];
}

你可能感兴趣的:(数据结构)