数组元素全排列、组合 C语言代码
permutation 排列
combination 组合
一、题目来源
Linux C编程一站式学习课后练习题:
https://akaedu.github.io/book/ch08s03.html
定义一个数组,编程打印它的全排列。比如定义:
#define N 3
int a[N] = { 1, 2, 3 };
则运行结果是:
$ ./a.out
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
1 2 3
程序的主要思路是:
把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。
把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。
把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。
可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。
完成了上述要求之后再考虑第二个问题:如果再定义一个常量M表示从N个数中取几个数做排列(N == M时表示全排列),原来的程序应该怎么改?
最后再考虑第三个问题:如果要求从N个数中取M个数做组合而不是做排列,就不能用原来的递归过程了,想想组合的递归过程应该怎么描述,编程实现它。
二、参考代码
segmentfault: C语言如何打印一个数组排列组合?
https://segmentfault.com/a/1190000000725176
#include <stdio.h>
#define N 4
#define M 3int a[N];void perm(int);
void print();
void swap(int, int);int main(void)
{int i;int b[N] = {1, 2, 3, 4};for (i = 0; i < N; i++){a[i] = b[i];}perm(0);return 0;
}void perm(int offset)
{int i;if (offset == N - 1){print();return;}else{for (i = offset; i < N; i++){swap(i, offset);perm(offset + 1);swap(i, offset);}}
}void print()
{int i;for (i = 0; i < N; i++)printf("%d", a[i]);printf("\n");
}void swap (int i, int offset)
{int temp;temp = a[i];a[i] = a[offset];a[offset] = temp;
}
三、这篇博文的初衷
先说下写这篇博文的初衷.
题目是《Linux C编程一站式学习》课后练习题里的,老师已经给了解题思路.
看似简单的题目,自己思考了一个多小时,却无从下手,只得在网上搜索答案,然后找到了这段参考代码,当然,相同的代码有很多博主都在引用,我也不知道最初出处,反正功劳都是人家的,和我无关,我只知道运行结果确实是正确的.理解代码费了好几个小时,非常的头大.最后还是耐着性子,在纸上一步一步画出了框架.
这里详细写下程序的运算过程,自己总结经验的同时,希望也能对有相同困扰的其他同学有所帮助.
四、自己的理解
个人认为这段代码的难点在于 perm()
这个函数.其他的都比较好理解,比如:
print()
: 依次打印数组a[N]
中的各元素;swap(int i,int offset)
: 交换数组中a[i]
和a[offse]
这两个元素的位置;
下面详细说明 perm()
这个函数,理解难点在于 perm()
中的 for
循环.
4.1、 perm() 函数
为更好理解,以 4 个元素的数组来说明,即 int a[4] = {1,2,3,4};
.
从 main()
函数里的 perm(0)开始,如下图:
由上图的perm()
函数运行过程可以看出,第一层 for
循环实现的作用是把数组中的第一个元素和后边每个元素依次调换(保证每个元素都有机会排在第一个元素,),第二层 for
循环实现的作用是在第一个元素已经确定的情况下把第二个元素和后边每个元素(第三个、第四个…元素)依次调换,最后一层 for
循环实现的作用把倒数第二个元素和之后的元素(最后一个)调换,此时满足条件 offset == N - 1
即递归的 Base case
基础条件,打印出结果.
第二个问题
问题:如果再定义一个常量M表示从N个数中取几个数做排列(N == M时表示全排列),原来的程序应该怎么改?
代码:
#include <stdio.h>
#define N 5
#define M 3int a[N];void perm(int);
void print();
void swap(int, int);int main(void)
{int i;int b[N] = {1, 2, 3, 4, 5};for (i = 0; i < N; i++){a[i] = b[i];}perm(0);return 0;
}void perm(int offset)
{int i;if (offset == M){ //改了这里print();return;}else{for (i = offset; i < N; i++){swap(i, offset);perm(offset + 1);swap(i, offset);}}
}void print()
{int i;for (i = 0; i < M; i++) //改了这里printf("%d", a[i]);printf("\n");
}void swap (int i, int offset)
{int temp;temp = a[i];a[i] = a[offset];a[offset] = temp;
}
改了两个地方:一个是perm()
函数,另一个是print()
函数.
从第一个问题的解决过程中可以看出,因为只需要取 M
个元素进行排列,可以只让for
循环执行到数组的第M
个元素,offset==M
是终止条件,即进行到第M-1
层for
循环,而第 M
个元素不会再和之后的元素进行调换.其实此处的offset==M
改为offset==N-1
,程序依然可以得到正确结果,从print()
函数可以看出,只打印了数组的前M
个元素,因此,offset=N-1
这个条件比offset==M
进行了更多的运算,对第M
后的元素排序是多余的,多做了一些无用功.
第三个问题 从N个数中取M个数做组合
代码:
#include <stdio.h>
#define N 5
#define M 3int a[N], b[M], count = 0;void comb(int, int);
void print();
void swap(int, int);int main(void)
{int i;int c[N] = {1, 2, 3, 4, 5};for (i = 0; i < N; i++){a[i] = c[i];}count = 0;comb(N, M);return 0;
}void comb(int n, int m)
{int i;if (m == 0) {print();return;} else {for (int i = n-1; i >= 0; i--){b[m-1] = a[i];//print();//printf("test\n");comb(i, m-1);}}
}void print()
{int i;for (i = 0; i < M; i++)printf("%d", b[i]);printf("\n");
}void swap (int i, int offset)
{int temp;temp = a[i];a[i] = a[offset];a[offset] = temp;
}
为更好理解,以从 5 个元素的数组中取 3 个元素进行组合为例来说明, int a[5] = {1,2,3,4,5};
.
代码中共有 3 个 数组;
c[]
数组的作用主要用于给数组a[]
赋值;- 数组
a[]
中的元素给数组b[]
赋值; - 打印数组
b[]
中的元素即可得到结果;
从 main()
函数里的 comb(0)开始,如下图:
从上图中可以看出,第一层for
循环作用是把数组a[]
中的元素从后到前(本例中是以5,4,3,2,1的顺序)依次赋值给数组b[]
的第M
个元素;
第二层for
循环作用是把数组a[]
中的元素(第二层循环选取的元素只能排在第一层循环选取的元素的前面)赋值给数组b[]
的第M-1
个元素;
…
最后一层for
循环作用是把a[]
中的元素赋值给数组b[]
的第 1 个元素;此时 m==0
条件成立,即所谓的 Base case
基础条件成立,打印出结果.
其实从上图中,可以看到有些步骤是多余的,comb(i,m-1)
,当 i < m-1
时,最终演变的结果总是 i<-1
比 m==0
提前到来,最终的结果就是不会再有print()
运行 .因此可以稍微优化下程序,在comb(n,m)
函数中添加判断n
和m
大小的if...else
条件语句,减少不必要的循环.
五、如果本博文里的图片看不清
如果图片看不清,把以下内容放到 txt文本文件里,用notepad++软件(取消自动换行)打开即可.另外,notepad++软件可以把txt转换成html,然后用浏览器里打开更方便查看.
数组成员全排列.c.txt.html
// 初始数组是{1,2,3,4} perm(0) ↓
offset = 0 // N是4; offset只有等于3的时候才会运行print(); ↓
进入 for 循环 ↓
第 1 次循环 // 此时 数组a[4] = {1,2,3,4}; ↓
offset = 0, i = 0; ↓
swap(i, offset),即 a[0] 和 a[0] 交换位置,数组元素位置其实没变化,数组a[4] = {1,2,3,4}; ↓
perm(offset + 1),即perm(1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(1) //perm(1)进入递归,此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 1 ↓ ↓ ↓ 进入 for 循环 ↓ ↓ ↓ 第 1.1 次循环 // 此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ offset = 1, i = 1; ↓ ↓ ↓ swap(i, offset),即 a[1] 和 a[1] 交换位置,此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ perm(offset + 1),即perm(2)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(2) //perm(2)进入递归,此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 2 ↓ ↓ ↓ ↓ ↓ 进入 for 循环 ↓ ↓ ↓ ↓ ↓ 第 1.1.1 次循环 ↓ ↓ ↓ ↓ ↓ offset = 2, i = 2; ↓ ↓ ↓ ↓ ↓ swap(i, offset),即 a[2] 和 a[2] 交换位置,此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ ↓ ↓ perm(offset + 1),即perm(3)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(3) //perm(3)进入递归,此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 3 ↓ ↓ ↓ ↓ ↓ ↓ ↓ if 条件为真,运行print()函数 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 依次打印数组a[4] = {1,2,3,4}的各元素,"1,2,3,4"; ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← return //返回上一层 ↓ ↓ ↓ ↓ ↓ swap(i, offset),归位,即 a[2] 和 a[2] 交换位置,此时数组a[4] = {1,2,3,4}; ↓ ↓ ↓ ↓ ↓ i = i + 1; // 此时 i = 3; ↓ ↓ ↓ ↓ ↓ 第 1.1.2 次循环 ↓ ↓ ↓ ↓ ↓ offset = 2, i = 3; ↓ ↓ ↓ ↓ ↓ swap(i, offset),即 a[3] 和 a[2] 交换位置,此时 数组a[4] = {1,2,4,3}; ↓ ↓ ↓ ↓ ↓ perm(offset + 1),即perm(3)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(3) //perm(3)进入递归,此时 数组a[4] = {1,2,4,3}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 3 ↓ ↓ ↓ ↓ ↓ ↓ ↓ if 条件为真,运行print()函数 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 依次打印数组a[4] = {1,2,4,3}的各元素,"1,2,4,3"; ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← return //返回上一层; ↓ ↓ ↓ ↓ ↓ swap(i, offset),归位,即 a[3] 和 a[2] 交换位置,此时数组a[4] = {1,2,3,4}; ↓ ↓ ↓ ↓ ↓ i = i + 1; // 此时 i = 4; ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← i = 4; // 已经不满足 i < 4 的条件,退出 1.1 层的循环,进入 1.2 层的循环,此时数组a[4] = {1,2,3,4}; ↓ ↓ ↓ swap(i, offset),归位,即 a[1] 和 a[1] 交换位置,此时数组a[4] = {1,2,3,4}; ↓ ↓ ↓ i = i + 1; // 此时 i = 2; ↓ ↓ ↓ 第 1.2 次循环 // 此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ offset = 1, i = 2; ↓ ↓ ↓ swap(i, offset),即 a[2] 和 a[1] 交换位置,此时 数组a[4] = {1,3,2,4}; ↓ ↓ ↓ perm(offset + 1),即perm(2)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(2) //perm(2)进入递归,此时 数组a[4] = {1,3,2,4}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 2 ↓ ↓ ↓ ↓ ↓ 进入 for 循环 ↓ ↓ ↓ ↓ ↓ 第 1.2.1 次循环 ↓ ↓ ↓ ↓ ↓ offset = 2, i = 2; ↓ ↓ ↓ ↓ ↓ swap(i, offset),即 a[2] 和 a[2] 交换位置,此时 数组a[4] = {1,3,2,4}; ↓ ↓ ↓ ↓ ↓ perm(offset + 1),即perm(3)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(3) //perm(3)进入递归,此时 数组a[4] = {1,3,2,4}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 3 ↓ ↓ ↓ ↓ ↓ ↓ ↓ if 条件为真,运行print()函数 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 依次打印数组a[4] = {1,3,2,4}的各元素,"1,3,2,4"; ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← return //返回上一层 ↓ ↓ ↓ ↓ ↓ swap(i, offset),归位,即 a[2] 和 a[2] 交换位置,此时数组a[4] = {1,3,2,4}; ↓ ↓ ↓ ↓ ↓ i = i + 1; // 此时 i = 3; ↓ ↓ ↓ ↓ ↓ 第 1.2.2 次循环 ↓ ↓ ↓ ↓ ↓ offset = 2, i = 3; ↓ ↓ ↓ ↓ ↓ swap(i, offset),即 a[3] 和 a[2] 交换位置,此时 数组a[4] = {1,3,4,2}; ↓ ↓ ↓ ↓ ↓ perm(offset + 1),即perm(3)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(3) //perm(3)进入递归,此时 数组a[4] = {1,3,4,2}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 3 ↓ ↓ ↓ ↓ ↓ ↓ ↓ if 条件为真,运行print()函数 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 依次打印数组a[4] = {1,3,4,2}的各元素,"1,3,4,2"; ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← return //返回上一层; ↓ ↓ ↓ ↓ ↓ swap(i, offset),归位,即 a[3] 和 a[2] 交换位置,此时数组a[4] = {1,3,2,4}; ↓ ↓ ↓ ↓ ↓ i = i + 1; // 此时 i = 4; ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← i = 4; // 已经不满足 i < 4 的条件,退出 1.2 层的循环,进入 1.3 层的循环,此时数组a[4] = {1,3,2,4}; ↓ ↓ ↓ swap(i, offset),归位,即 a[2] 和 a[1] 交换位置,此时数组a[4] = {1,2,3,4}; ↓ ↓ ↓ i = i + 1; // 此时 i = 3; ↓ ↓ ↓ 第 1.3 次循环 // 此时 数组a[4] = {1,2,3,4}; ↓ ↓ ↓ offset = 1, i = 3; ↓ ↓ ↓ swap(i, offset),即 a[3] 和 a[1] 交换位置,此时 数组a[4] = {1,4,3,2}; ↓ ↓ ↓ perm(offset + 1),即perm(2)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(2) //perm(2)进入递归,此时 数组a[4] = {1,4,3,2}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 2 ↓ ↓ ↓ ↓ ↓ 进入 for 循环 ↓ ↓ ↓ ↓ ↓ 第 1.3.1 次循环 ↓ ↓ ↓ ↓ ↓ offset = 2, i = 2; ↓ ↓ ↓ ↓ ↓ swap(i, offset),即 a[2] 和 a[2] 交换位置,此时 数组a[4] = {1,4,3,2}; ↓ ↓ ↓ ↓ ↓ perm(offset + 1),即perm(3)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(3) //perm(3)进入递归,此时 数组a[4] = {1,4,3,2}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 3 ↓ ↓ ↓ ↓ ↓ ↓ ↓ if 条件为真,运行print()函数 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 依次打印数组a[4] = {1,4,3,2}的各元素,"1,4,3,2"; ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← return //返回上一层 ↓ ↓ ↓ ↓ ↓ swap(i, offset),归位,即 a[2] 和 a[2] 交换位置,此时数组a[4] = {1,4,3,2}; ↓ ↓ ↓ ↓ ↓ i = i + 1; // 此时 i = 3; ↓ ↓ ↓ ↓ ↓ 第 1.3.2 次循环 ↓ ↓ ↓ ↓ ↓ offset = 2, i = 3; ↓ ↓ ↓ ↓ ↓ swap(i, offset),即 a[3] 和 a[2] 交换位置,此时 数组a[4] = {1,4,2,3}; ↓ ↓ ↓ ↓ ↓ perm(offset + 1),即perm(3)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(3) //perm(3)进入递归,此时 数组a[4] = {1,4,2,3}; ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ offset = 3 ↓ ↓ ↓ ↓ ↓ ↓ ↓ if 条件为真,运行print()函数 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 依次打印数组a[4] = {1,4,2,3}的各元素,"1,4,2,3"; ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← return //返回上一层; ↓ ↓ ↓ ↓ ↓ swap(i, offset),归位,即 a[3] 和 a[2] 交换位置,此时数组a[4] = {1,4,3,2}; ↓ ↓ ↓ ↓ ↓ i = i + 1; // 此时 i = 4; ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← i = 4; // 已经不满足 i < 4 的条件,退出 1.2 层的循环,进入 1.3 层的循环,此时数组a[4] = {1,4,3,2}; ↓ ↓ ↓ swap(i, offset),归位,即 a[3] 和 a[1] 交换位置,此时数组a[4] = {1,2,3,4}; ↓ ↓ ↓ i = i + 1; // 此时 i = 4,已经不满足 i < 4 的条件,退出 1 层 循环,进入 2 层循环 ↓ ↓ ↓ 此时已经打印的排列有:1234,1243,1324,1342,1432,1423 ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← ↓ ↓
swap(i, offset),归位,即 a[0] 和 a[0] 交换位置,数组元素位置其实没变化,数组a[4] = {1,2,3,4}; ↓
i = i + 1; // 此时 i = 1; ↓
第 2 次循环 // 此时 数组a[4] = {1,2,3,4}; ↓
offset = 0, i = 1; ↓
swap(i, offset),即 a[1] 和 a[0] 交换位置,数组a[4] = {2,1,3,4}; ↓
perm(offset + 1),即perm(1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(1) 同理,分别打印: 2134,2143,2314,2341,2431,2413 ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← ↓ ↓
swap(i, offset),归位,即 a[1] 和 a[0] 交换位置,数组a[4] = {1,2,3,4}; ↓
i = i + 1; // 此时 i = 2; ↓
第 3 次循环 // 此时 数组a[4] = {1,2,3,4}; ↓
offset = 0, i = 2; ↓
swap(i, offset),即 a[2] 和 a[0] 交换位置,数组a[4] = {3,2,1,4}; ↓
perm(offset + 1),即perm(1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(1) 同理,分别打印: 3214,3241,3124,3142,3412,3421 ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← ↓ ↓
swap(i, offset),归位,即 a[2] 和 a[0] 交换位置,数组a[4] = {1,2,3,4}; ↓
i = i + 1; // 此时 i = 3; ↓
第 4 次循环 // 此时 数组a[4] = {1,2,3,4}; ↓
offset = 0, i = 3; ↓
swap(i, offset),即 a[3] 和 a[0] 交换位置,数组a[4] = {4,2,3,1}; ↓
perm(offset + 1),即perm(1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→perm(1) 同理,分别打印: 4231,4213,4321,4312,4132,4123 ↓ ↓ ↓ ↓ ↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← ↓ ↓
swap(i, offset),归位,即 a[3] 和 a[0] 交换位置,数组a[4] = {1,2,3,4}; ↓
i = i + 1; // 此时 i = 4,已经不满足 i < 4 的条件 ↓
退出 for 循环;
数组成员组合.c.txt.html
comb(N, M) //此时数组a[5]={1,2,3,4,5},b[3]={0,0,0}
↓
comb(5, 3)
↓
n=5,m=3
↓
第 1 次循环
↓
i=n-1 即i=4
↓
b[m-1]=a[i] 即b[2]=a[4] //此时数组b[3]={0,0,5}
↓
comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(4,2)
↓ ↓
↓ n=4,m=2
↓ ↓
↓ 第 1.1 次循环
↓ ↓
↓ i=n-1 即i=3
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[3] //此时数组b[3]={0,4,5}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(3,1)
↓ ↓ ↓
↓ ↓ n=3,m=1
↓ ↓ ↓
↓ ↓ 第 1.1.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=2
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[2] //此时数组b[3]={3,4,5}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(2,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 345
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ 第 1.1.2 次循环
↓ ↓ ↓
↓ ↓ i-- 即i=1
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[1] //此时数组b[3]={2,4,5}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 245
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ 第 1.1.3 次循环
↓ ↓ ↓
↓ ↓ i-- 即i=0
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[0] //此时数组b[3]={1,4,5}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 145
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ i-- 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=4,m=2,i=3 //此时数组b[3]={1,4,5}
↓ ↓
↓ 第 1.2 次循环
↓ ↓
↓ i-- 即i=2
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[2] //此时数组b[3]={1,3,5}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(2,1)
↓ ↓ ↓
↓ ↓ n=2,m=1
↓ ↓ ↓
↓ ↓ 第 1.2.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=1
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[1] //此时数组b[3]={2,3,5}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 235
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ 第 1.2.2 次循环
↓ ↓ ↓
↓ ↓ i-- 即i=0
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[0] //此时数组b[3]={1,3,5}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 135
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ i-- 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ ↓
↓ ↓
↓ n=4,m=2,i=2 //此时数组b[3]={1,3,5}
↓ ↓
↓ 第 1.3 次循环
↓ ↓
↓ i-- 即i=1
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[1] //此时数组b[3]={1,2,5}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,1)
↓ ↓ ↓
↓ ↓ n=1,m=1
↓ ↓ ↓
↓ ↓ 第 1.3.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=0
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[0] //此时数组b[3]={1,2,5}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 125
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ i-- 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=4,m=2,i=1 //此时数组b[3]={1,2,5}
↓ ↓
↓ 第 1.4 次循环
↓ ↓
↓ i-- 即i=0
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[0] //此时数组b[3]={1,1,5}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,1)
↓ ↓ ↓
↓ ↓ n=0,m=1
↓ ↓ ↓
↓ ↓ 第 1.4.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=4,m=2,i=0 //此时数组b[3]={1,1,5}
↓ ↓
↓ 第 1.5 次循环
↓ ↓
↓ i-- 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓
↓ 退出comb函数,返回上一层for循环
↓ ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓
n=5,m=3,i=4 //此时数组b[3]={1,1,5}
↓
第 2 次循环
↓
i-- 即i=3
↓
b[m-1]=a[i] 即b[2]=a[3] //此时数组b[3]={1,1,4}
↓
comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(3,2)
↓ ↓
↓ n=3,m=2
↓ ↓
↓ 第 2.1 次循环
↓ ↓
↓ i=n-1 即i=2
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[2] //此时数组b[3]={1,3,4}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(2,1)
↓ ↓ ↓
↓ ↓ n=2,m=1
↓ ↓ ↓
↓ ↓ 第 2.1.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=1
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[1] //此时数组b[3]={2,3,4}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 234
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ n=2,m=1,i=1 //此时数组b[3]={2,3,4}
↓ ↓ ↓
↓ ↓ 第 2.1.2 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=0
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[0] //此时数组b[3]={1,3,4}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 134
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ n=2,m=1,i=0 //此时数组b[3]={1,3,4}
↓ ↓ ↓
↓ ↓ 第 2.1.3 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=3,m=2,i=2 //此时数组b[3]={1,3,4}
↓ ↓
↓ 第 2.2 次循环
↓ ↓
↓ i-- 即i=1
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[1] //此时数组b[3]={1,2,4}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,1)
↓ ↓ ↓
↓ ↓ n=1,m=1
↓ ↓ ↓
↓ ↓ 第 2.2.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=0
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[0] //此时数组b[3]={1,2,4}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 124
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ n=1,m=1,i=0 //此时数组b[3]={1,2,4}
↓ ↓ ↓
↓ ↓ 第 2.2.2 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=3,m=2,i=1 //此时数组b[3]={1,2,4}
↓ ↓
↓ 第 2.3 次循环
↓ ↓
↓ i-- 即i=0
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[0] //此时数组b[3]={1,1,4}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,1)
↓ ↓ ↓
↓ ↓ n=0,m=1
↓ ↓ ↓
↓ ↓ 第 2.3.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=3,m=2,i=0 //此时数组b[3]={1,1,4}
↓ ↓
↓ 第 2.4 次循环
↓ ↓
↓ i-- 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓
n=5,m=3,i=3 //此时数组b[3]={1,1,4}
↓
第 3 次循环
↓
i-- 即i=2
↓
b[m-1]=a[i] 即b[2]=a[2] //此时数组b[3]={1,1,3}
↓
comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(2,2)
↓ ↓
↓ n=2,m=2
↓ ↓
↓ 第 3.1 次循环
↓ ↓
↓ i=n-1 即i=1
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[1] //此时数组b[3]={1,2,3}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,1)
↓ ↓ ↓
↓ ↓ n=1,m=1
↓ ↓ ↓
↓ ↓ 第 3.1.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=0
↓ ↓ ↓
↓ ↓ b[m-1]=a[i] 即b[0]=a[0] //此时数组b[3]={1,2,3}
↓ ↓ ↓
↓ ↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,0)
↓ ↓ ↓ ↓
↓ ↓ ↓ m == 0 →→→→ print()即打印 123
↓ ↓ ↓ ↓
↓ ↓ ↓ return 退出comb函数,返回上一层for循环
↓ ↓ ↓ ↓
↓ ↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓ ↓
↓ ↓ n=1,m=1,i=0 //此时数组b[3]={1,2,3}
↓ ↓ ↓
↓ ↓ 第 3.1.2 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=2,m=2,i=1 //此时数组b[3]={1,2,3}
↓ ↓
↓ 第 3.2 次循环
↓ ↓
↓ i-- 即i=0
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[0] //此时数组b[3]={1,1,3}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,1)
↓ ↓ ↓
↓ ↓ n=0,m=1 //此时数组b[3]={1,1,3}
↓ ↓ ↓
↓ ↓ 第 3.2.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=2,m=2,i=0 //此时数组b[3]={1,1,3}
↓ ↓
↓ 第 3.3 次循环
↓ ↓
↓ i-- 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓
n=5,m=3,i=2 //此时数组b[3]={1,1,3}
↓
第 4 次循环
↓
i-- 即i=1
↓
b[m-1]=a[i] 即b[2]=a[1] //此时数组b[3]={1,1,2}
↓
comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(1,2)
↓ ↓
↓ n=1,m=2
↓ ↓
↓ 第 4.1 次循环
↓ ↓
↓ i=n-1 即i=0
↓ ↓
↓ b[m-1]=a[i] 即b[1]=a[0] //此时数组b[3]={1,1,2}
↓ ↓
↓ comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,1)
↓ ↓ ↓
↓ ↓ n=0,m=1 //此时数组b[3]={1,1,2}
↓ ↓ ↓
↓ ↓ 第 4.1.1 次循环
↓ ↓ ↓
↓ ↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓ ↓
↓ ↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
↓ n=1,m=2,i=0 //此时数组b[3]={1,1,2}
↓ ↓
↓ 第 4.1 次循环
↓ ↓
↓ i-- 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓
n=5,m=3,i=1 //此时数组b[3]={1,1,2}
↓
第 5 次循环
↓
i-- 即i=0
↓
b[m-1]=a[i] 即b[2]=a[0] //此时数组b[3]={1,1,1}
↓
comb(i,m-1)→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→comb(0,2)
↓ ↓
↓ n=0,m=2
↓ ↓
↓ 第 5.1 次循环
↓ ↓
↓ i=n-1 即i=-1 //此时已经不满足 i>=0的条件,退出本层for循环
↓ ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓
n=5,m=3,i=1 //此时数组b[3]={1,1,1}
↓
第 6 次循环
↓
i-- 即i= -1 //此时已经不满足 i>=0的条件,退出本层for循环
↓
退出 comb(5, 3)
数组元素全排列、组合 C语言代码相关推荐
- JavaScript二维数组元素排列组合
lizuncong (lizuncong) · GitHubI am a strong believer in reverse engineering. lizuncong has 42 reposi ...
- php如何统计数组的个数,如何用php统计数组元素的个数(附代码)
这篇文章主要介绍了php统计数组元素个数的方法的相关资料,需要的朋友可以参考下 count():对数组中的元素个数进行统计; sizeof():和count()具有同样的用途,这两个函数都可以返回数组 ...
- java 分治法排序_分治法实现1-N的数字按字典序全排列组合 Java语言
package 分治法; import java.util.Arrays; /* * 将数字 1 - n进行全排列 按字典序从小到大输出 * 如 1 - 3 * 123 132 213 231 312 ...
- Java中如何实现数组反转,将数组元素倒过来排列?【含详细解析】
Java中如何实现数组反转,将数组元素倒过来排列?[含详细解析] 数组元素反转:本来的样子{1,2,3,4,5},反转后{5,4,3,2,1}.要求,不能使用新数组. 分析过程 数组元素反转其实就是对 ...
- 字符串分割成数组元素和去掉重复元素
处理买家姓名,需要对姓名去前后空格,需要去掉重复姓名,还要计算重复姓名的次数,把买家姓名保存为数组元素,以下是参考代码: /** 功能:把字符串转换为数组,字符串用换行隔开,数组元素去掉空的.前后空格 ...
- php 求数组组合数,php实现求数组全排列,元素所有组合的方法
下面小编就为大家带来一篇php求数组全排列,元素所有组合的方法总结.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 本文实例讲述了php求数组全排列,元素所有组合的方法总 ...
- c语言中的字节和元素,C语言指向数组元素的指针
指向数组元素的指针和运算法则 所谓指向数组元素的指针,其本质还是变量的指针.因为数组中的每个元素,其实都可以直接看成是一个变量,所以指向数组元素的指针,也就是变量的指针. 指向数组元素的指针不难,但很 ...
- 【C语言】12-指向一维数组元素的指针
本文目录 一.用指针指向一维数组的元素 二.用指针遍历数组元素 三.指针与数组的总结 四.数组.指针与函数参数 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...
- c语言数组最大元调换,c语言数组元素交换有关问题,请高手过来看看
c语言数组元素交换问题,请高手过来看看 主要问题是数组元素交换不正确,以下是代码: #include #include #define PI 3.1415926 #define MAX 512 dou ...
- 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.
数据结构大体成上可以分成两种: 1. 线性结构. 2. 非线性结构( 树,图) 1. 什么是线性结构 大概上可以这样定义: 加入所有的节点可以用一条直线连接起来. 就是线性结构... 2 ...
最新文章
- ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)
- 独家报道:众说纷纭 云安全究竟为何物?
- [NOI2014] 起床困难综合症(二进制,贪心)
- SAGAN生成更为精细的人脸图像(tensorflow实现)
- 《深入浅出DPDK》学习思维导图
- sql语法、特殊符号及正则表达式的使用
- 七月算法--12月机器学习在线班-第九次课笔记—推荐系统
- expdp导出表结构_Oracle用exp导出部分表和expdp
- 非因解读|Digital Spatial Profiler 新一代高维度空间组学技术
- 关于数据库字段模糊查询
- 用3DSMAX制作室内效果图的九大步骤
- 盘点 4 个开源小游戏
- MATLAB信号处理---学习小案例(10)---Z反变换
- 机器学习在信息安全领域的应用现状和畅想
- php身份证识别ORC
- android 画图
- line-height绝对值和相对值的区别
- centos7.X系统初始化脚本
- 数学建模overleaf模板_数学建模从入门到精通必备资料,大神经验助你赢战9月数模国赛!...
- 万用表测占空比怎么接_如何使用万用表测量频率和占空比?