排列组合(1)——递归函数

排列组合(1)——递归函数

最近,在学习数据结构的中的栈和队列,看到了关于栈的一个比较经典的例子,就是关于我们生活中经常遇到的排列组合问题,下面我们来看看如何用编程实现。

开始前的一些说明

使用的语言:C#(窗体程序)
使用的工具:Visual Studio 2019

整体思路

如右图所示:<img src="https://img2020.cnblogs.com/blog/1972407/202003/1972407-20200319152645903-1662745978.png"style="width:200px;float:right;">对于四个数的排列,把它想象成占位置,先用"1"占第一个位置,然后在考虑第二个位置的归属,分别可能是"2"、"3"、"4",决定好第二个位置之后,再考虑第三个位置的归属,这样依次下去......通过for循环实现每一列数的选择,再通过递归实现行的选择。(其实就是通过for循环从1-4中选出一个数出来,而放在哪个位置就通过递归进行选择)

核心代码

public void Fun_Permute_Recursion(int n, int m, int k)
{
	for (int i = 1; i <= n; i++)//从1-n中选数
	{
		bool tag = false;
    	for (int j = 1; j <= k - 1; j++)//把新的要选进来的数和数组里的数进行比较,看有没有重复的
    	{
			if (i == m_percom_temp[j])
			{ 
				tag = true; break; 
			}
		}
   		if (tag == false)
    	{
			m_percom_temp[k] = i;
        	if (k < m)//判断当前是否已经选满
        	{
				Fun_Permute_Recursion(n, m, k + 1);//进行下一个位置的选择
			}
        	else
			{
				m_strout += Getstr_percom_temp(m);//选好了进行输出
			}
	    }
	}
}

关键部分代码的解释:

Fun_Permute_Recursion函数的几个参数
n:总数
m:从n总选出的个数
k:现在要排第几个位置

tag:作为一个判断的条件,当有重复的数时,为false;否则,为true

m_percom_temp:用来存储排好的数。每一次排好一组就输出一组,新生成的一组再原来的基础上进行覆盖。

函数的补充

Getstr_percom_temp(m):

    public string Getstr_percom_temp(int m)
{
	string strout = "";
	string str = "";
for(int i = 1; i <= m; i++)
{
	if(i != m)
	{
		str +=  Convert.ToString(m_percom_temp[i])+",";
	}
	else
	{
		str += Convert.ToString(m_percom_temp[i]);
	}
}
	strout = "(" + count + ")\t\t" + "【" + str + "】\n";
   		count++;
	return strout;
}

运行结果展示

后记

排列组合问题很好的将递归函数的特性展现了出来,其实递归函数的思想也包含于栈当中,是栈的一个具体体现。如果这篇文章当中有什么不对的地方希望大家能够帮忙指正,有什么不懂的地方欢迎交流!

posted @ 2020-03-16 00:31  知常求智  阅读(487)  评论(0编辑  收藏  举报