java 递归算法问题:(n,k)=(n-1,k-1)+(n-1,k)?

看见一本java数据结构和算法的书,递归那个章节时,有个例子说登山队选择成员组队的问题:有5个登山队员,名字为A、B、C、D、E,在其中选择3个。
可能组合是:ACB ABD ABE ACE ACE ADE BCD BCE BDE CDE
然后问题来了,书上说,由A开始的和不是A开始的组合。假设把从5个人中选出3个的组合简写成(5,3).规定n是这群人的大小,并且k是组队的大小,
有:
(n,k)=(n-1,k-1)+(n-1,k),我想问问这个是怎么来的?
ps:"书上说,由A开始的和不是A开始的组合"可以不用看。

第1个回答  2009-12-08
(n,k)=(n-1,k-1)+(n-1,k)
就是说 n 个里面要选 k 个,分为两组,包含 A和不包含A。
包含 A : 已经包含A了,所以总数是 n-1 个了;同理,已经包含了A,所以只要选 k -1 个就可以了,所以为 (n-1,k-1)。
不包含A:已经不包含A了,所以总数是 n-1 个;还是选 k个,所以为(n-1,k)。
无限递归即可以了。
第2个回答  2009-12-07
其实这是涉及到数学中的“组合、排列”的知识的。
排列就如:“五个球,有顺序的抽出其中两个,求:可能出现的所有结果”;
组合就如:“五个球,任意抽出两个,求:可能出现的所有结果”。
注意:他们的区别是——排列中,顺序的不同会导致结果的不同;而组合中,顺序的不同,结果是会一样的。
你这个问题中提到的其实就是“组合”的情况。
计算组合类的题目时,其实是有一个专门的写法的(但这里写不出来,用Word才可以)。
用一般的表达式表达的话,你的这个问题中,
(n,k)=[n×(n-1)×……×(n-k+1)]÷[k×(k-1)×……×1] ①式
而同理,
(n-1,k)=[(n-1)×(n-2)×……×(n-k)]÷[(k)×(k-1)×(k-2)……×1] ②式
(n-1,k-1)=[(n-1)×(n-2)×……×(n-k+1)]÷[(k-1)×(k-2)×……×1] ③式
将③式的分子、分母各乘上一个k(即乘以1,不会影响值大小),然后将分子与②式的分子相加,就可以得到①式了。即:
(n,k)=(n-1,k-1)+(n-1,k)是成立的。
你还是不明白的话可以百度HI问我。这样说很难明白…本回答被提问者采纳

java 递归算法问题:(n,k)=(n-1,k-1)+(n-1,k)?
(n,k)=(n-1,k-1)+(n-1,k)就是说 n 个里面要选 k 个,分为两组,包含 A和不包含A。包含 A : 已经包含A了,所以总数是 n-1 个了;同理,已经包含了A,所以只要选 k -1 个就可以了,所以为 (n-1,k-1)。不包含A:已经不包含A了,所以总数是 n-1 个;还是选 k个,所以为...

怎样用计算器计算一个组合数?
C(n,k) = C(n-1,k-1) + C(n-1,k)该公式表示,从n个元素中取出k个元素的组合数,等于从n-1个元素中取出k-1个元素的组合数,加上从n-1个元素中取出k个元素的组合数。通过递归地使用该公式,可以计算出任意组合数的值。杨辉三角法 杨辉三角是一种由二项式系数构成的三角形。在杨辉三角...

时间复杂度怎么算例题
(1)递归执行过程 例子:求N!。这是一个简单的"累乘"问题,用递归算法也能解决。n!=n*(n-1)!n>1 0!=1,1!=1n=0,1 因此,递归算法如下:Java代码 fact(intn){ if(n==0||n==1)return1;else returnn*fact(n-1);} 以n=3为例,看运行过程如下:fact(3)---fact(2)---fact(1...

用java递归方法实现
1、递归做为一种算法在程序设计语言中广泛使用,是指函数\/过程\/子程序在运行过程中直接或间接调用自身而产生的重入现象。2、递归算法一般用于解决三类问题:1)数据的定义是按递归定义的。(Fibonacci(斐波那契)的函数)2)问题解法按递归算法实现。(回溯)3)数据的结构形式是按递归定义的。(树的遍历...

java中递归的作用是什么?为什么要用到递归?
递归的作用:递归算法可以解决一些通过递归定义的题目。首先需要明白什么是递归定义的题目,通俗一点来说就是一个大问题中蕴含着小问题,而小问题同时又与大问题的结构相同,只是规模更小。比如n阶乘的定义可以理解为:n!= n*(n-1)!从上面不难看出 (n-1)! 就是比n! 规模更小的问题,按照此...

4个元素的集合{a,b,c,d}可能产生的排列。(递归算法)
include<string.h> void Perm(char m[], int k, int n) { char t;int i;if (k == n - 1) { \/\/输出一种排列 for (i = 0; i < n; i++)printf("%c", m[i]);printf("\\n");} else \/\/产生{m[k],…,m[n-1]}各种排列 for (i = k; i < n; i++) { t = ...

求组合数infunctionmain怎么解决
当 k=0 或 k=n 时,C(n,k) = 1;当 k>0 且 k<n 时,C(n,k) = C(n-1,k) + C(n-1,k-1)。下面是一个用递归方式求解组合数的例子。其中,函数名称为comb,函数参数为整数 n 和 k,函数返回值为 C(n,k):在主函数 main 中,可以调用 comb 函数来计算组合数。例如,计算 ...

递归算法
可用递归公式如下: fac:=n*fac(n-1) {当n>0时} fac(n)={ fac:=1; { 当n=0时} 可编写程序如下: program facn; var n:integer; function fac(n:integer):real; begin if n=0 then fac:=1 else fac:=n*fac(n-1); end; begin write('n=');readln(n); writeln(n,'!=',...

递归算法时间复杂度题目求解答...
1、递归 是指对一个问题的求解,可以通过同一问题的更简单的形式的求解来表示.并通过问题的简单形式的解求出复杂形式的解.递归是解决一类问题的重要方法.递归程序设计是程序设计中常用的一种方法,它可以解决所有有递归属性的问题,并且是行之有效的.但对于递归程序运行的效率比较低,无论是时间还是空间...

用C++递归算法解一道题
if(n-1==k)return a[n-1];else return HuoNa(a, n, k+1, x0)*x0+a[k];} --- \/*本程序利用霍纳规则计算型如:*\/ \/*p(x)=AnX*\/ include<iostream.h> \/*函数1(非递归算法)*\/ double heNaFunction_1(double Array[], double x, int n);\/*函数2(递归算法)*\/ double he...

相似回答