1、国家三级(数据库技术)机试模拟试卷 100及答案与解析 一、程序设计题 1 编写函数 jsValue,它的功能是:求 Hofstadter数列中的第 m项 H(m)(m1000),结果由函数返回。其中数列 H(n)的定义为: H(1)=H(2)=1 H(n)=H(n-H(n-1)+H(n-H(n-2)(n 2) 最后调用函数 writeDat()读取 50个数据 m,分别得出结果且把结果输出到文件out.dat中。 例如:当 t=997时,函数值为 605。 部分源程序已给出。 请 勿改动主函数 main()和写函数 writeDat()的内容。 #include stdio. h int j
2、sValue(int m) main ( ) int m; m=300; printf (“m=%d, k-%dn“, m, jsValue (m); writeDat ( ); writeDat ( ) FILE *in, *out; int i,m,s; in= fopen ( “in. dar“ , “r“ ); out=f open ( “out. dar“ , “w“ ); for (i=0; i 50; i+) fscanf (in, “%d“, s=jsValue (m); printf( “%dn“, s ); fprintf (out, “%dn“ , s ); fclose
3、 (in); fclose (out); 国家三级(数据库技术)机试模拟试卷 100答案与解析 一、程序设计题 1 【正确答案】 int jsVelue(int m) if (m 0) return -1; /*参数错误,正常运行不会出现 */ if(m=1 | m=2) return 1; /*初值 H1: H2=1*/ else return jsValue (m-jsValue (m-1) +jsValue (m-jsValue (m-2); /*调用 jsValue递归计算 Hk*/ /*解法二,递推 */ int jsValue(int m) int H1000, i; H1=1; H2=1; /*初值 H1=H2=1*/ for (i=3; i =m; i+) Hi = Hi-Hi-1) +Hi-Hi-2; /*H(k)(k i)的值都己计算完成,直接使用 */ return Hm; /*返回所求的值 */ 【试题解析】 类型:序列计算。 关键点:分析序列定义,选择合适的方法生成和存储序列或序列中的特定值。 此题有两种解法: 1按照定义编写递归函数; (计算量大,容易超时,慎用 )。 2保存所有值,从小到大递推求解。