发现一道递归函数的题目,从n个人里面选择k个人组成group,其中的分析方法很像算法课上学习到的动态规划法:
当从n个人里面选择k个人的时候,我们可以假设第n个人被选中了,那么从n个人里面选择k个人的group总共有:在剩下的n-1个人里面选择k-1个人; 我们还可以假设第n个人没有被选中,那么则需要:在n-1个人里面选择k-1个人。 所以可以写成公式:
C(n, k)= C(n-1, k-1) + C(n-1, k)
这个时候我们可以分析一个base case:当k=n 或者 k = 0的时候,我们可以选择的方法就只有1 种。
由此,可以写出这个题目的递归公式:
#include <iostream>
#include <string>
using namespace std;
int C(int n, int k)
{
int result;
if(k>n)
{
result = 0;
}
if (k==0 || n == k)
{
result = 1;
}
else
{
result = C(n-1, k-1) + C(n-1, k);
}
return result;
}
int main()
{
int n;
int k;
cout <<"Please insert n and k: "<<endl;
cin>> n ;
cin>>k ;
cout<<"The groups of choosing "<< k <<" people from " << n << " is "<< C(n,k)<<endl;
}
是在练习题目的时候,突然想到,其实这就是动态规划的一种思考方式。