全排列的递归写法详解

一、什么是全排列

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。

当m=n时,所有的排列情况叫全排列。

二.递归

递归的基本思想就是某个函数直接或者间接的调用自身,就叫做递归。

递归的两个关键

1.判断条件

递归其实就是在一个函数内部继续调用这个函数,所以必须有一个判断条件来判断这个递归在什么条件下结束,不然就会一直递归下去,导致溢出。

2.递归中的变化

每一次函数调用都应该出现参数的变化,使参数向 关键1 中的判断条件靠拢,在一次次的递归中,最后达成判断条件,使递归停止。

例子

#include <stdio.h>

//输入一个整数n,用递归的思想打印出这个整数n的全排列(0<n<10)
void swap(int *a, int *b)//交换两个数字
{
	int t = *a;
	*a = *b;
	*b = t;
}

void rec(int* p, int a, int b)
{
	if (a >= b-1)//关键1 判断条件,达成条件后,下面有return;退出递归
	{
		int i = 0;
		for (i = 0; i < b;i++)
		{
			printf("%d ", *(p + i));
		}
		printf("\n");
		return;
	}

	int i = 0; 
	for (i = a; i < b; i++)
	{
		swap(p + i, p + a);//递推前
		rec(p,a+1, b);//关键二, 每次递归时,参数都会向着关键1 的判断条件靠拢直到达成条件
		swap(p + i, p + a);//递推后
	}

}

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[10];
	
	int i = 0;
	for (i = 0;i < n; i++)
	{
		arr[i] = i + 1;
	}

	rec(arr, 0, n);
	return 0;
}

递归在全排列中的思想就是每一次递归都会陷入一个迭代,比如有五个数字,那么第一层递归就会迭代第一个数字,让它从1变到5,然后在变的过程中,刚开始第一个数字是1,然后进入第二层递归,再将第二个数字限制为一个数,比如2,然后进入第三层递归,再将第三个数字固定了,直到第4层递归,限制完第四个数字后,就不用进入递归了,因为总共就五个数字,限制了前四个,第五个也出来了,然后就可以设置一个条件,到达第四层递归后开始迭代,和第五个数的值进行交换,然后退到第三层递推,将第三个数字进行迭代,就先和第四个数字换位置,再进入第四层递归,再退回第三层递归,将第三个和第五个数字进行交换。后面的也就像这也去递推就行了,需要注意的是:每次递推前会交换两个数字,递推后还会再交换回来

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值