用递归法计算从n个人中选择k个人组成一个委员会的不同组合数

分析:

1、如果k>n,结果为0

2、k=n时,只有1组

3、k<n的时候,可以把解空间分为两部分:假设其中一个人叫X,那么选X的解和不选X的解加起来就是总的解。不选X的话,那么在剩下的n-1个人中选k个。选X的话,在剩下的n-1个人中再选k-1个。

代码:

#include<iostream>
using namespace std;
int fun(int n, int k){
    if (k == n||k==0){
        return 1;
    }
    if (k > n){
        return 0;
    }
    return fun(n - 1, k) + fun(n - 1, k - 1);
}
int main(){
    cout << "输入两个整数n和k:";
    int n, k;
    cin >> n >> k;
    cout << "C(n,k)=" << fun(n, k) << endl;
    return 0;
}
时间: 2024-10-07 06:54:40

用递归法计算从n个人中选择k个人组成一个委员会的不同组合数的相关文章

用递归法计算斐波那契数列的第n项

   斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. [Fibonacci.cpp] #include<iostream>#

2.简单求和[递归法]

计算1+2+3+4+5,用递归法的两种形式,练习这题主要查看递归规律,训练递归,形成递归的[本能].第一种,从后往前加. int sum(int a[],int n) { return n==0?0:sum(a,n-1)+a[n-1]; } 第二种,从两边对加,例:(1+5)+(2+4)+3,这个需要判定,假如数组的个数为偶,则左边+1==右边,如果为奇数,则左边+2==右边,需要将这三个数之和返回: int sum(int a[],int l,int r) { if(l+2==r)/*中间隔一

欧几里得算法 - 计算两个正整数的最大公约数

欧几里得算法-计算两个正整数a,b的最大公约数 #定理:gcd(a,b) = gcd(b, a mod b) 终止条件:余数等于0 返回结果:余数等于0时的除数b # -*- coding: utf-8 -*- __author__ = 'nob' #迭代欧几里得 def iterative_gcd(a, b):     r = a % b     while(r):         a = b         b = r         r = a % b     return b     #

算法基础三 递归法

#include<iostream> using namespace std; /*递归法*/ /*递归法会在函数中调用自己,注意结束条件,避免无限循环,递归法的原理是压栈出栈*/ /*例1:f(n)=n! 则f(n)=f(n-1)*n*/ int f1(int n) { if (n < 2)return 1; else return n*f1(n - 1); } /*例2 楼梯有n阶台阶, 上楼可以一步上1阶, 也可以一步上2阶, 编一程序计算共有多少种不同的走法.*/ /*分析:最后

递归法

递归法(Recursion)是一种在函数或方法中调用自身的编程技术,在计算机方法中,使用递归技术往往使函数的定义和算法的描述简洁且易于理解.任何可以用计算机求解的问题所需要的计算时间都与其规模有关.而且规模越小,解题所需要的计算时间通常越小,从而比较容易处理. 简而言之,递归思想就是用与自身问题相似但规模较小的问题来描述自己. 例如,兔子出生两个月后就有繁殖能力,一对兔子每个月能生出一对兔子来.如果所有兔子都不死,那么一年以后可以繁殖多少对兔子? 第一个月小兔子没有繁殖能力,所有还是一对:两个月

谭浩强 c程序设计 8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串&quot;486&quot;。n的位数不确定,可以是任意位数的整数。

8.17用递归法将一个整数n转换成字符串.例如,输入486,应输出字符串"486".n的位数不确定,可以是任意位数的整数. #include <stdio.h> char str1[20];int i=0;long n;int main(){        int longToStr(long n);    char *revstr(char *str, int len);    printf("请输入一个整数n:\n");    scanf("

C语言之函数调用13—递归法求N阶勒让德多项式的值

//递归法! /* ======================================================= n阶勒让德多项式,n=1时,Pn(x)=x;n>=1时, Pn(x)=((2n-1)x-Pn-1(x)-(n-1)Pn-2(x))/2. ======================================================= */ #include <stdio.h> #include <math.h> double p(

C语言之函数调用14—递归法打印勒让德多项式前N项

//递归法 /* ================================================================== 题目:勒让德多项式 ================================================================== */ #include <stdio.h> double p(int n,double x) { if(n==0)return 1.0; else if(n==1)return x; else

C语言之函数调用16—递归法之一般函数的调用

//递归法 /* ================================================================== 题目:F(x,1)=1 F(x,n)=F(2x+1,n-1)*x  (n>1) ================================================================== */ #include<stdio.h> double F(float x,int n) { if(n==1) return