请编写一个函数comm(int n,int k),该函数将用递归算法计算从n个人中选择k个人组成一个委员会的不同组合数,由n个人里选k个人的组合数=由(n-1)个人里选k个人的组合数+由(n-1)个人里选(k-1)个人的组合数。注意:部分源程序已存在文件test41_2.cpp中。请勿修改主函数main和其他函数中的任何内容,仅在函数comm的花括号中填写若干语句。源程序文件test41-2.cpp清单如下:include<iostream.h>int comm(int n, int k){}void m

题目

请编写一个函数comm(int n,int k),该函数将用递归算法计算从n个人中选择k个人组成一个委员会的不同组合数,由n个人里选k个人的组合数=由(n-1)个人里选k个人的组合数+由(n-1)个人里选(k-1)个人的组合数。

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

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

源程序文件test41-2.cpp清单如下:

include<iostream.h>

int comm(int n, int k)

{

}

void main ( )

{

int n=7, k=3;

cout<<"n=7,k=3"<<endl;

cout<<comm(n,k)<<endl;

}


相似考题
参考答案和解析
正确答案:int comm(int n int k) { if(k>n) return 0; else if(n==k||k==0) return 1; else return comm(n-1k)+comm(n-1k-1); }
int comm(int n, int k) { if(k>n) return 0; else if(n==k||k==0) return 1; else return comm(n-1,k)+comm(n-1,k-1); } 解析:本题考查的是考生对简单的递归函数的应用。递归函数是算法设计中比较经典的一种,它主要应用数学的递推公式进行反复的迭代计算并最终得到正确答案,在编程上体现为在函数体内部对自身的调用。本题的大体思路为:递归的结束条件为n=k或者k=0,否则就递推的调用公式右端的两项继续训算,直到满足结束条件再逐层返回。
更多“请编写一个函数comm(int n,int k),该函数将用递归算法计算从n个人中选择k个人组成一个委员会的不 ”相关问题
  • 第1题:

    请编写函数fun(),它的功能是:求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们放在 a所指的数组中,通过n返回这些数的个数。

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

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

    试题程序:

    include <conio.h>

    include <stdio.h>

    void fun (int *a,int *n)

    {

    }

    main()

    {

    int aa[1000], n, k;

    clrscr();

    fun(aa,&n);

    for(k=0;k if((k+1)%10==0)

    {printf("%5d",aa[k]);

    printf("\n");} /*一行写9个数*/

    else

    printf("%5d ",aa[k]);

    }


    正确答案:void fun(int *a int *n) { int ij=0; for(i=1;i=1000;i++) /*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并放入数组a中*/ if((i%7==0||i%11==0)&&i%77!=0) a[j++]=i; *n=j; /*传回满足条件的数的个数*/ }
    void fun(int *a, int *n) { int i,j=0; for(i=1;i=1000;i++) /*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并放入数组a中*/ if((i%7==0||i%11==0)&&i%77!=0) a[j++]=i; *n=j; /*传回满足条件的数的个数*/ } 解析:注意本题题目应是找出能被7或11整除但不能同时被7和11整除的所有整数。能同时被7和11整除的整数一定能被77整除,且不能被77整除的数不一定就是能被7或11整除的数。所以可得出程序中的if()。按运算优先级可知 (i%7==0||i%11==0),注意,两边必须要有小括号。

  • 第2题:

    请编写一个函数fun(),它的功能是:求出1到m(含m)之内能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。

    例如,若传给m的值为50,则程序输出:

    7 11 14 21 X 28 33 35 42 44 49

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

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

    试题程序:

    include<conio.h>

    include<stdio.h>

    define M 100

    void fun(int m, int *a, int *n)

    {

    }

    main()

    {

    int aa[M],n,k;

    clrscr();

    fun(50,aa,&n);

    for(k=0;k<n; k++)

    if((k+1)%20==0) /*每行输出20个数*/

    {printf("%4d",aa[k]);

    printf("\n");

    }

    else

    printf("%4d",aa[k]);

    printf("\n");

    }


    正确答案:void fun(int mint *aint *n) { int ij=0; for(i=1;i=m;i++) if(i%7==0||i%11==0) /*求出1到m(含m)之内能被7或11整除的所有整数放在数组a中*/ a[j++]=i; *n=j; /*返回这些数的个数*/ }
    void fun(int m,int *a,int *n) { int i,j=0; for(i=1;i=m;i++) if(i%7==0||i%11==0) /*求出1到m(含m)之内能被7或11整除的所有整数放在数组a中*/ a[j++]=i; *n=j; /*返回这些数的个数*/ } 解析:本题要找出能被7或11整除的所有整数,注意数学中的“或”和C语言中的“或”的区别,但在此处,if条件语句中用了“||”运算符,若要找能同时被7和11整除的所有整数则在if()中应用“&&”运算符。

  • 第3题:

    请编写一个函数intproc(int*s,intt,int*k),用来求出数组的最大元素在数组中的下标并存放在k所指的存储单元中。 例如,输入如下整数: 876675896101999401980431451777 则输出结果为4,999。 注意:部分源程序给出如下。 请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。 试题程序:


    正确答案:

    【解析】要得到数组中的最大元素的下标,需要比较数组中的每一个元素。将最大的元素返回给主函数,最大元素的下标通过形参返回给主函数。

  • 第4题:

    请编写函数void countValue(int *a,int *n),它的功能是:求出1到1000之内能被7或11整除但不能同时被7和11整除的所有整数并存放在数组a中,并通过n返回这些数的个数。

    注意:部分源程序已给出。

    请勿改动主函数main()和写函数writeDAT()的内容。

    试题程序:

    include<conio.h>

    include<stdio.h>

    void countValue(int *a, int *n)

    {

    }

    main ( )

    {

    int aa[1000],n, k;

    clrscr();

    countValue (aa, &n);

    for(k=0;k<n; k++)

    if((k+1) %10 ==0)

    {

    printf("%5d",aa[k]);

    printf("\n");

    }

    else printf("%5d",aa[k]);

    writeDAT();

    }

    writeDAT ( )

    {

    int aa[1000],n, k;

    FILE *fp;

    fp=fopen("out79.dat","w");

    countValue(aa,&n);

    for(k=0; k<n; k++)

    if((k+1)%10==0)

    {

    fprintf(fp,"%5d",aa[k]);

    fprintf(fp,"\n");

    }

    else fprintf (fp,"%5d",aa[k]);

    fclose(fp);

    }


    正确答案:void countValue(int *a int *n) { int i; *n=0; for(i=1;i=1000;i++) if(i%7==0 && i%11) /*将能被7整除但不能被11整除的数存入数组a中*/ { *a=i; *n-*n+1; /*统计个数*/ a++; } else if (i%7 && i%11==0) /*将能被11整除但不能被7整除的数存入数组a中*/ { *a=i; *n=*n+1; /*统计个数*/ a++; } }
    void countValue(int *a, int *n) { int i; *n=0; for(i=1;i=1000;i++) if(i%7==0 && i%11) /*将能被7整除但不能被11整除的数存入数组a中*/ { *a=i; *n-*n+1; /*统计个数*/ a++; } else if (i%7 && i%11==0) /*将能被11整除但不能被7整除的数存入数组a中*/ { *a=i; *n=*n+1; /*统计个数*/ a++; } } 解析:本题考查的知识点如下:
    (1)指针的使用。
    (2)“%”运算符。
    (3)判断结构中多个条件的布尔运算。
    本题中,函数countValue()以指针为参数,这里就要涉及到指针的使用。a是指向数组的指针,初始时,指向数组的第一个元素。地址每加1时,依次指向后面的元素。一个数a若能被b整除,则a除以b取余得数为0。能被7或11整除,但不能被7和11同时整除,则有两种情况,能被7整除但不能被11整除,能被11整除但不能被7整除。这里就要用到多个条件的布尔运算。

  • 第5题:

    请编写一个函数int fun(int *s,int t,int *k),用来求出数组的最大元素在数组中的下标并存放在k所指的存储单元中。

    例如,输入如下整数:

    876 675 896 101 301 401 980 431 451 777

    则输出结果为6,980。

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

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

    试题程序:

    include <conio.h>

    include <stdio.h>

    int fun(int *s,int t,int *k)

    {

    }

    main()

    {

    int a[10]={ 876,675,896,101,301,401,

    980,431,451,777},k;

    clrscr();

    fun(a, 10, &k);

    printf("%d, %d\n ", k, a[k]);

    }


    正确答案:int fun(int *sint tint *k) { int i; *k=0; /*k所指的数是数组的下标值*/ for(i=0;it;i++) if(s[*k]s[i]) *k=i; /*找到数组的最大元素把该元素的下标赋给k所指的数*/ return s[*k]; /*返回数组的最大元素*/ }
    int fun(int *s,int t,int *k) { int i; *k=0; /*k所指的数是数组的下标值*/ for(i=0;it;i++) if(s[*k]s[i]) *k=i; /*找到数组的最大元素,把该元素的下标赋给k所指的数*/ return s[*k]; /*返回数组的最大元素*/ } 解析:本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始应让*k的值为数组中的某一下标值,即*k=0。