数组元素全排列、组合 C语言代码

本文详细解析了如何使用C语言实现数组的全排列和组合算法,包括递归过程的解释、代码示例及优化建议。通过示例代码帮助理解perm()函数的工作原理,并探讨了从N个数中取M个数做排列和组合的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 3

int 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 3

int 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-1for循环,而第 M 个元素不会再和之后的元素进行调换.其实此处的offset==M改为offset==N-1,程序依然可以得到正确结果,从print()函数可以看出,只打印了数组的前M个元素,因此,offset=N-1这个条件比offset==M进行了更多的运算,对第M后的元素排序是多余的,多做了一些无用功.

第三个问题 从N个数中取M个数做组合

代码:

#include <stdio.h>
#define N 5
#define M 3

int 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<-1m==0提前到来,最终的结果就是不会再有print()运行 .因此可以稍微优化下程序,在comb(n,m)函数中添加判断nm大小的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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值