参考答案和解析
用基本运算乘法的运算次数作为衡量时间复杂度的量当n=0时,程序执行if(n==0) return 1;,并没有做乘法,故T(0)=0;当n>=1时程序执行n*Func(n-1);此时T(n)= T(n-1)+1故: 替换法: T(0)=0,T(1)=1,T(2)=2-----总结得到:T(n)=n;归纳法证明:(1),当n=0时,T(0)=0,结论成立;(2)假设当k所以,对所有n>=0有T(n)=n;成立.迭代法:T(n)=T(n-1)+1=(T(n-2)+1)+1=((T(n-3)+1)+1)+1=....=T(0)+1+1......+1(n个1)=n
更多“编写递归函数,计算n!。要求n值从主函数输入,n为正整数。”相关问题
  • 第1题:

    已知递归函数fun的定义如下: int fun(int n) { if(n<=1)return 1;//递归结束情况 else return n*fun(n-2);//递归 } 则函数调用语句fun(5)的返回值是( )。

    A.5

    B.12

    C.15

    D.30


    正确答案:C
    解析:递归函数fun被定义为含有参数int n返回整型.其中 fun函数递归调用本身,当n=1时,fun返回1,如果大于1那么执行n*fun(n-2)。所以,当n等于5时,执行5*fun(3);当n等于3时继续调用fun,3*fun(1),即fun(5)=5*(3*fun(1)),答案为15。

  • 第2题:

    T(n)=O(f(n))中,函数O()的正确含义为

    A.T(n)为f(n)的函数

    B.T(n)为n的函数

    C.存在足够大的正整数M,使得T(n)≤M×f(n)

    D.存在足够大的正整数M,使得M×f(n)≤T(n)


    正确答案:C

  • 第3题:

    假定输入的字符串中只包含字母和*号。请编写函数 fun(),它的功能是:使字符串中前部的*号不得多余n个;若多余n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。

    例如,字符串中的内容为****A*BC*DEF*G*******,若 n的值为2,删除后,字符串中的内容则应当是 **A*BC*DEF*G*******;若n的值为4,则字符串中的内容仍为****A*BC*DEF*G******。n的值在主函数中输入。在编写函数时,不得使用C语言提供的字符串函数。

    注意:部分源程序给出如下。

    请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。

    试题程序:

    include <stdio.h>

    include <conio.h>

    void fun (char Aa, int n)

    {

    }

    main ()

    { char s[81];int n;

    printf ("Enter a string : \n") ;gets (s);

    printf ("Enter n : "); scanf ("%d", &n);

    fun( s,n );

    printf("The string after deleted :\n");

    puts (s);

    }


    正确答案:void fun(char *aint n) { int i=0k=0; char *p*t; p=t=a; /*开始时p与t同时指向数组的首地址*/ while(*t==‘*’) /*用k来统计前部星号的个数*/ {k++; t++;} if(k>n) /*如果k大于n则佼p的前部保留n个星号其后的字符依次存入数组a中*/ {while(*P) {a[i]=*(p+ k-n); i++ p++; } a[i]=‘\0’; /*在字符串最后加上结束标志位*/ } }
    void fun(char *a,int n) { int i=0,k=0; char *p,*t; p=t=a; /*开始时,p与t同时指向数组的首地址*/ while(*t==‘*’) /*用k来统计前部星号的个数*/ {k++; t++;} if(k>n) /*如果k大于n,则佼p的前部保留n个星号,其后的字符依次存入数组a中*/ {while(*P) {a[i]=*(p+ k-n); i++ p++; } a[i]=‘\0’; /*在字符串最后加上结束标志位*/ } } 解析:while() 循环的作用是计算出前部星号的个数;if()的作用是判断星号个数是否多于n个,若是则只保留n个星号,即从字符串前部的倒数第n个星号开始,到最后一个字符都存入数组a中,最后记得在字符串最后加上结束标志位。

  • 第4题:

    请编写函数fun(),其功能是:计算并输出下列多项式的值。

    S=1+4/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)

    例如,着主函数从键盘给n输入50后,则输出为 S=1.960784。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include <stdio.h>

    double fun(int n)

    {

    }

    main ()

    {

    int n;

    double s;

    printf ("\nInput n: ");

    scanf ("%d", &n);

    s=fun (n);

    printf ("\n\ns=%f\n\n", s);

    }


    正确答案:double fun (int n) { int i; double s=0.0s1=0.0; for(i=1;i=n;i++) {s1=s1+i; /*求每—项的分母*/ s=s+1.0/s1; /*求S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)*/ } return s; }
    double fun (int n) { int i; double s=0.0,s1=0.0; for(i=1;i=n;i++) {s1=s1+i; /*求每—项的分母*/ s=s+1.0/s1; /*求S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)*/ } return s; } 解析:该程序的数学思路是:在程序中输入n后,以前n项的和作为分母递加,由于s1是浮点类数据所以s=s+1.0/s1; for 循环的作用是每一次循环给总结果s加上一项1.0/s1。

  • 第5题:

    请编写函数fun,它的功能是:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。

    例如,在主函数中从键盘给n输入20后,输出为:s=0.583333。注意:要求n的值不大于100。

    部分源程序在文件PROGl.C中。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。


    正确答案:
    解析:该程序功能是计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。解题过程首先求出能被5或9整除的所有自然数,然后在此基础上求得这些数的倒数之和。

  • 第6题:

    设有一个递归算法如下 im fact(int n){ if(n<=0)return 1; else return n * fact(n-1); } 下面正确的叙述是(35)。

    A.计算fact(n)需要执行n次函数调用

    B.计算fact(n)需要执行n+1次函数调用

    C.计算fact(n)需要执行n+2次函数调用

    D.计算fact(n)需要执行n-1次函数调用


    正确答案:B
    解析:连同其他函数调用fact和递归调用次数,计算fact(n)需要执行n+1次函数调用。

  • 第7题:

    请编写函数fun,其功能是:计算并输出下列多项式的值:

    例如,在主函数中从键盘给n输入50后,输出为:s=1.718282。

    注意:要求n的值大于1但不大于100。部分源程序在文件PROGl.C中。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。


    正确答案:
    解析:该程序功能是计算并输出多项式值。根据题干中给出的数列,首先推出每一项的表达式,然后再对多项式进行累加求和。

  • 第8题:

    请编写函数fun(),其功能是:计算并输出下列多项式值。

    S=(1+1/2)+(1/3+1/4)+…+(1/(2n-1)+l/2n)

    例如,若主函数从键盘给n输入12后,则输出为 S=3.775958。

    n的值要求大于1但不大于100。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include<stdio.h>

    double fun(int n)

    {

    }

    main()

    {

    int n;

    double s;

    printf("\nlnput n:");

    scanf("%d",&n);

    s=fun(n);

    printf("\ns=%f\n",s);

    }


    正确答案:double fun(int n) { int i; double s=0.0; for(i=1;i=n;i++) /*计算S=(1+l/2)+(1/3+1/4)+…+(1/(2n-1)+1/2n)*/ s=s+(1.0/(2*i-1)+1.0/(2*i)); return s; }
    double fun(int n) { int i; double s=0.0; for(i=1;i=n;i++) /*计算S=(1+l/2)+(1/3+1/4)+…+(1/(2n-1)+1/2n)*/ s=s+(1.0/(2*i-1)+1.0/(2*i)); return s; } 解析:本题中s=s+(1.0/(2*i-1)+1.0/(2*i));语句是用C程序去表达题目中的每一项,这是关键,其他问题不难理解。

  • 第9题:

    请补充main函数,该函数的功能是:输入两个正整数m和n,求这两个数的最大公约和最小公倍数。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在 main函数的横线上填入所编写的若干表达式或语句。

    试题程序:

    include <stdio.h>

    main ( )

    {

    int a, b, n, m, t;

    clrscr ();

    printf ("\nInput two numbers: \n");

    scanf ("%d, %d", &n, &m);

    if (n<m)

    {

    a=m;

    b=n;

    }

    else

    {

    a=n;

    b=m;

    }

    while(【 】)

    {

    t=【 】

    a=b;

    b=t;

    }

    printf ("greatest con. non divisor:

    %d\n", a);

    printf ("least common multiple:

    %d\n",【 】);

    }


    正确答案:b!=0 a%b; n*m/a
    b!=0 a%b; n*m/a 解析:第一空:本题考查求最大公约数和最小公倍数的方法。变量a保存两数中较大着,变量b保存较小者,采用循环的方法求解最大公约数,循环结束条件是b等于0。第二空:求解最大公约数的思路是,将a对b求余,如果余数为0, 则b即为两数的最大公约数,如果余数不为0,则将b赋给a,余数赋给b,继续将a对b求余,如此循环,直到余数为0。第三空:最小公倍数等于两数的乘积除以最大公倍数。

  • 第10题:

    请编写函数proc(),它的功能是计算: s=(1n(1)4-1n(2)+In(3)4-…+1n(m))0.5 在C语言中可调用log(n)函数求1n(n)。 例如,若n1的值为30,则proc()函数值为8.640500。 注意:部分源程序给出如下。 请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。 试题程序:


    正确答案:

    【解析】由题目中所给表达式可知,表达式的值为m项表达式的和然后开平方。可以首先通过m次循环求得m项表达式的和,然后将其和开平方并返回到主函数当中。

  • 第11题:

    设n的初值为正整数,设计一个递归算法如下:int fact(int n){if(n<=0)return 1;else return(n*fact(n-1));}以下叙述中,正确的是______。

    A.计算fact(n)需要执行n+2次函数调用
    B.计算fact(n)需要执行n+1次函数调用
    C.计算fact(n)需要执行n次函数调用
    D.计算fact(n)需要执行n-1次函数调用

    答案:B
    解析:
    本题考查函数递归调用方面的相关知识。递归法是描述算法的一种强有力的方法,其思想是:将N=n时不能得出解的问题,设法递归(压栈)转化为求n-1,n-2,…的问题,一直到N=0或1的初始情况,由于初始情况的解可以给出,因此,开始层层退栈得到N=2,3,…,n时的解,得到最终结果。本题中,主程序调用fact(n)称为外部调用,其他调用称为内部调用,直到调用fact(0)为止。fact(n)调用fact(n-1),fact(n-1)调用fact(n-2)……fact(1)调用fact(0),内部调用n次,外部调用一次,共n+1次。

  • 第12题:

    要求编写一个主函数,计算并输出12+22+...+n2值,其中n值由键盘输入。


  • 第13题:

    请补充main函数,该函数的功能是:从键盘输入一个长整数,如果这个数是负数,则取它的绝对值,并显示出来。

    例如,输入:-3847652,结果为:3847652。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

    试题程序:

    include<stdio.h>

    include<conio.h>

    main()

    {

    long int n;

    clrscr();

    printf("Enter the data;\n");

    scanf(【 】);

    printf("*** the absolute value ***\n");

    if(n<0)

    【 】

    printf("\n\n");

    printf(【 】);

    }


    正确答案:"%1d"&n n=-n; "%1d"n
    "%1d",&n n=-n; "%1d",n 解析:第一空:本题考查对标准输入函数scanf()的调用格式,当输入为长整型数时,格式控制字符串为“%1d”,输入的长整数存于变量n中。第二空:当输入的数是负数时,则取它的相反数,即为它的绝对值。第三空:本题考查对标准输出函数print()的调用格式,当输出为长整型数时,格式控制字符串为“%1d”。

  • 第14题:

    请编写函数fun(),其功能是;计算井输出下列多项式值。

    S=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)-1/2n)

    例如,若主函数从键盘给n输入8后,则输出为 S-0.662872。

    注意;部分源程序给出如下。

    请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。

    试题程序;

    include<stdio. h>

    double fun(int n)

    {

    }

    main ()

    {

    int n;

    double s;

    printf("\nInput n: ");

    scanf ("%d", &n);

    s=fun (n);

    printf ("\ns=%f\n ", s);

    }


    正确答案:double fun(int n) { int i; double s=0.0; for (i=1; i=n; i++) s=s+(1.0/(2*i-1)-1.0/(2*i)); /*计算S= (1-1/2) + (1/3-1/4) +…+ (1/(2n-1)-l/2n) */ return s; }
    double fun(int n) { int i; double s=0.0; for (i=1; i=n; i++) s=s+(1.0/(2*i-1)-1.0/(2*i)); /*计算S= (1-1/2) + (1/3-1/4) +…+ (1/(2n-1)-l/2n) */ return s; } 解析:本题中s=s+(1.0/(2*i-1)-1,O/(2*i));语句是用C程序去表达题目中的每一项,这是关键,其他问题不难理解。

  • 第15题:

    请编写一个函数inline long sum(int n),用递归函数完成运算:sum(n)=1*1+2*2+…n*n,递归表达式为 sum(n)=sum(n-1)+n2。

    注意:部分源程序已存在文件test10_2.cpp中。

    请勿修改主函数main和其他函数中的任何内容,仅在函数sum的花括号中填写若干语句。

    文件test10_2.cpp的内容如下:

    include<iostream.h>

    inline long sum(int n)

    {

    }

    void main()

    {

    int n;

    cout<<"输入n:";

    cin>>n;

    cout<<"结果为:"<<sum(n)<<endl;

    }


    正确答案:inline long sum(int n) { if(n==1) return 1; else return n*n+sum(n-1); }
    inline long sum(int n) { if(n==1) return 1; else return n*n+sum(n-1); } 解析:本题考查的是考生对递归函数掌握的熟练程度。递归的终止条件为n=1时,值为1。

  • 第16题:

    编写函数fun(),函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。

    S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)

    例如:若n的值为11时,函数的值为1.833333。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include <conio.h>

    include <stdio.h>

    include <string.h>

    float fun(int n)

    {

    }

    main()

    {

    int n;

    float s;

    clrscr();

    printf("\nPlease enter N: ");

    scanf("%d",&n);

    s=fun(n);

    printf("The result is:%f\n " , s);

    }


    正确答案:float fun(int n) { int is1=0; float s=0.0; for(i=1;i<=n;i++) {s1=s1+i; /*求每一项的分母*/ s=s+1.0/s1; /*求多项式的值*/ } return s; }
    float fun(int n) { int i,s1=0; float s=0.0; for(i=1;i<=n;i++) {s1=s1+i; /*求每一项的分母*/ s=s+1.0/s1; /*求多项式的值*/ } return s; } 解析:本题中用s1来表示式中每一项的分母,而每一项的分母都是其前一项分母加项数。注意由于s1定义成一个整型,所以在s=s+1.0/s1中不能把1.0写成1。

  • 第17题:

    有如下递归函数:

    int Fun(int n){

    if(n<=1) return 1;

    ______

    }

    请补充完整,使得函数Fun能够正确计算形参n的阶乘。


    正确答案:else return n*Fun(n-1);
    else return n*Fun(n-1); 解析:此题考查的是递归函数。函数Fun中的参数n小于2时,Fun函数返回1,其余返回值为n*Fun(n-1)。

  • 第18题:

    请编写一个函数int sum(int n),该函数完成1+2+3+…+n的运算,并返回运算结果,其中n>0。注意:请使用递归算法实现该函数。

    注意:部分源程序已存在文件:test11.cpp中。

    请勿修改主函数main和其他函数中的任何内容,仅在函数sum的花括号中填写若干语句。

    文件test11_2.cpp的内容如下:

    include<iostream.h>

    int sum(int n)

    {

    }

    void main()

    {

    int n;

    cout<<"输入n:";

    cin>>n;

    int result;sum(n);

    cout<<"结果为:"<<result<<endl;

    }


    正确答案:int sum(int n) { if(n==1) return 1; else return n + sum(n-1); }
    int sum(int n) { if(n==1) return 1; else return n + sum(n-1); } 解析:本题考查的是考生对于递归函数的熟练应用。递归的终止条件为n=1时,返回值为1

  • 第19题:

    请编写一个函数fun(),它的功能是计算并输出给定整数n的所有因子(不包括1与自身)的平方和(规定n的值不大于100)。

    例如:主函数从键盘给输入n的值为56,则输出为 sum=1113。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include <stdio.h>

    long fun(int n)

    {

    }

    main()

    {

    int n;

    long sum;

    printf("Input n:");

    scanf("%d",&n);

    sum=fun(n);

    printf("sum=%ld\n",sum);

    }


    正确答案:long fun(int n) { int i; long s=0; for(i=2;i=n-1;i++) /*从2~n-1中找n的所有因子*/ if(n%i==0) s+=i*i; /*将所有因子求平方加*/ return s; /将平方和返回*/ }
    long fun(int n) { int i; long s=0; for(i=2;i=n-1;i++) /*从2~n-1中找n的所有因子*/ if(n%i==0) s+=i*i; /*将所有因子求平方加*/ return s; /将平方和返回*/ } 解析:本题的解题思路是用n逐个去除以2到n-1之间的所有数,如果n能被除尽,则把所得到的一个因子的平方累加到s中去。

  • 第20题:

    请编写函数fun(),该函数的功能是:计算并输出

    S=1+(1+20.5)+(1+20.5+30.5)+…+(1+20.5+30.5+…+n0.5)

    例如,若主函数从键盘给n输入20后,则输出为

    s=534.188884。

    注意;部分源程序给出如下。

    请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。

    试题程序:

    include <math. h>

    include <stdio. h>

    double fun(int n)

    {

    }

    main()

    {

    int n;

    double s;

    printf("\n\nInput n: ");

    scanf ("%d", &n);

    s=fun (n)

    printf ("\n\ns=%f\n\n", s);

    }


    正确答案:double fun(int n) { int i; double s=0.0s1=0.0; for(i=1;i=n; i++) {s1=s1+pow(i0.5); /*求每—项*/ s=s+s1; /*按公式求出s*/ } return s; }
    double fun(int n) { int i; double s=0.0,s1=0.0; for(i=1;i=n; i++) {s1=s1+pow(i,0.5); /*求每—项*/ s=s+s1; /*按公式求出s*/ } return s; } 解析:我们先用数学的思路读懂该程序,并用1个字符表示“()”内的值。在本程序中用s1来表示题中每个小括号内的值,第1项相当于有1个10.5次方(它还是1),第2项相当于第1项的值加上200.5次方,第3项相当于第2项的值加上30.5次方,…,依次类推。函数pow (x,y)的功能是求出x的y次方,该函数已在库函数math. h>中定义(即可直接使用)。要程序中用s来表示总的结果,每1次循环加1次s1即加1项。

  • 第21题:

    请编写函数fun,其功能是:计算并输出

    例如,在主函数中从键盘给n输入20后,输出为:s=534.188884。

    注意:要求n的值大于1但不大于100。

    部分源程序在文件PROGl.C中。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。


    正确答案:
    解析:该程序功能是对题干中给出的多项式的求解。根据题干中给出的数列,首先推出每一项的表达式,然后再对多项式进行累加求和。

  • 第22题:

    设n的初始值为正整数,设计一个递归算去如下: int fact (int n) { if (n<=0) return l; else return (n*fact (n-l)) ; 以下叙述中正确的是(49) 。

    A.计算fact(n)需要执行n次函数调用

    B.计算fact(n)需要执行n+l次函数调用

    C.计算fact(n)需要执行n+2次函数调用

    D.计算fact(n)需要执行n-l次函娄[调用


    正确答案:B
    本题考查函数递归调用方面的相关知识。递归法是描述算法的一种强有力的方法,其思想是:将N=n时不能直接求解的问题,设法递归(压栈)转化为求n-l,n-2,…的问题一直到N=O或1的初始情况,由于初始情况的解可以给出或方便得到,因此,开始层层退栈得到N=2,3,…,n时的解,直到得到最终结果。本题中,主程序调用fact(n)称为外部调用,其他调用称为内部调用,直到调用fact(0)为止。fact(n)调用fact(n-l),fact(n-l)调用fac(n-2),…,fact(l)调用fact(0),内部调用n次,外部调用一次,共n+l次。

  • 第23题:

    要求编写一个递归函数“int FF(int a[], int n)”,求出数组a中所有n个元素之积并返回。

  • 第24题:

    问答题
    请编写函数fun(),该函数的功能是:计算并输出给定整数n的所有因子(不包括1和自身)之和。规定n的值不大于1000。例如,在主函数中从键盘给n输入的值为856,则输出为:sum=763。  注意:部分源程序给出如下。  请勿改动主函数main()和其他函数中的任何内容,仅在fun()函数的花括号中填入所编写的若干语句。  试题程序如下:/**********code.c**********/#include int fun(int n){}void main(){ int n,sum; printf(Input n: ); scanf(%d,&n); sum=fun(n); printf(sum=%d,sum);}

    正确答案:

    int fun(int n)
    {
    int s=0,i;
    for(i=2;i<=n-1;i++)
    if(n%i==0)
    s+=i;
    return s;
    }
    解析:

      本题的设计思路是:①遍历从2到n-1的所有整数;②用条件语句找出能被n整除的整数i,并累加求和;③用return语句返回因子的和。