1、三级数据库技术机试-184 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编写函数 jsValue,它的功能是:求 Hofstadter数列中的第 m项 H(m)(m1000),结果由函数返回。其中数列 H(n)的定义为:H(1)=H(2)=1H(n)=H(n-H(n-1)+H(n-H(n-2)(n2)最后调用函数 writeDat()读取 50个数据 m,分别得出结果且把结果输出到文件 out.dat中。例如:当 t=997时,函数值为 605。部分源程序已给出。请勿改动主函数 main()和写函数 writeDat()的内容。#inc
2、ludestdio. hint jsValue(int m)main ( )int m;m=300;printf (“m=%d, k-%d/n“, 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; i50; i+) fscanf (in, “%d“, s=jsValue (m);printf( “%d/n“, s );fprintf (out, “%d/n“ , s );f
3、close (in);fclose (out);(分数:100.00)_三级数据库技术机试-184 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.编写函数 jsValue,它的功能是:求 Hofstadter数列中的第 m项 H(m)(m1000),结果由函数返回。其中数列 H(n)的定义为:H(1)=H(2)=1H(n)=H(n-H(n-1)+H(n-H(n-2)(n2)最后调用函数 writeDat()读取 50个数据 m,分别得出结果且把结果输出到文件 out.dat中。例如:当 t=997时,函数值为 605。部分源程序已给出。请勿
4、改动主函数 main()和写函数 writeDat()的内容。#includestdio. hint jsValue(int m)main ( )int m;m=300;printf (“m=%d, k-%d/n“, 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; i50; i+) fscanf (in, “%d“, s=jsValue (m);printf( “%d/n
5、“, s );fprintf (out, “%d/n“ , s );fclose (in);fclose (out);(分数:100.00)_正确答案:(提示:类型:序列计算。关键点:分析序列定义,选择合适的方法生成和存储序列或序列中的特定值。此题有两种解法:1按照定义编写递归函数;(计算量大,容易超时,慎用)。2保存所有值,从小到大递推求解。解答:/*解法一,递归*/int jsVelue(int m)if (m0)return -1;/*参数错误,正常运行不会出现*/if(m=1 | m=2)return 1;/*初值 H1:H2=1*/elsereturn 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)(ki)的值都己计算完成,直接使用*/return Hm;/*返回所求的值*/)解析: