失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > c语言实现排列组合:实现matlab中的nchoosek函数

c语言实现排列组合:实现matlab中的nchoosek函数

时间:2018-11-13 23:10:16

相关推荐

c语言实现排列组合:实现matlab中的nchoosek函数

1.求排列组合结果总数

组合:采用递归算法,根据下面第二行公式。

int sumzuhe(int N, int K){if (K == 0)return 1;if (N == K)return 1;return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K);}

排列:采用递归。思想来自:/u012814856/article/details/73863086。

int sumpailie(int N,int K){if (K ==1)return N;return sumpailie(N - 1, K - 1)*N;}

2.展示排列,组合结果。

排列:首先从(N)个中取一个数,再在剩余的一次次取一个数,每取一个数就把这位标记为取过了,以免下次再取。取够K个数之后,把K个数输出,展示结果(所以需要提前有一个数组来存 放结果)。然后再取寻找别的第K个数,依次在不断寻找别的第(K-1),(K-2),,,,,个数。取完一个数把标记位设为未取过。

void pailie(int a[],int N,int K,int level)//(K==N)时为全排列{if (level>=K){ for (int j = 0; j < level; j++)printf("%d ", result[j]);printf("\n");return;}for (int i = 0; i < N; i++){if (flag[i] == false)//该位未取过{flag[i] = true;result[level++] = a[i];//取出修改标记位pailie(a, N, K , level);//在未被使用过的里面再选择一个level--;//重新取别的位flag[i] = false;}}}

组合:组合与排列不同的是:不分顺序。我们可以假设一直是从前往后选数,那么前面作为开头的数,后面就不可以再作为开头。比如:A,B,C,D。当我第一次选择第一个数为A的话,把以A为头的数选完之后,下一次选第一个数决不能是A。所以需要有一个变量来控制所选择的第一个数(下面的程序为Index)。然后再在第一个数(比如选择A)之后的数中挑选接下来的数。选择接下来的数与上面排列类似。

void zuhe(int a[], int N, int K,int index,int deep){if (deep >= K){for (int i = 0; i < K; i++){printf("%d ", result[i]);}printf("\n");return;}for (int i = index; i <N; i++){result[deep] = a[i];deep++;zuhe(a, N, K, index + 1, deep);deep--;index++;}}

完整程序:

如果觉得《c语言实现排列组合:实现matlab中的nchoosek函数》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。