0
点赞
收藏
分享

微信扫一扫

c语言——全排列

phpworkerman 2022-01-20 阅读 81

递归在于反复调用自身函数

这里就不说概念了,自己搜一搜全都有。

一、使用递归需要:

①递归边界(尽头,防止函数无休止的调用)

②递归式(将问题分解成子问题的手段)

二、回溯全排列

还有一种是斐波那契函数,这里就不说了。

全排列是什么?

把1~n这n个整数按某个顺序摆放的结果称为这n个整数的排列,全排列指这n个整数能形成的所有排列。例如1、2、3这三个数,最终可以有(1,2,3);(1,3,2);(2,1,3);(2,3,1);(3,1,2);(3,2,1)。

怎么实现?思路为下:

——《算法笔记》胡凡

大家可以看过思路想一下代码怎么写,没有想法的话那么代码如下:也是《算法笔记》中的:

#include<cstdio>
const int maxn = 11;
//P 为当前排列 HashTable记录整个数x是否已经在P中
int n,P[maxn],hashTable[maxn] = {false};
//当前处理排列的第index位置
void generateP(int index) 
{
    if(index == n+1)  //递归边界,已经处理完的1~n
	{
        for(int i=1;i<=n;i++)
		{
            printf("%d",P[i]);
        }
        printf("\n");
        return ;
    }
    for(int x = 1;x<=n;x++)   //枚举1~n,试图将x填入P[index]
	{
        if(hashTable[x] == false)  //如果不在p[0]~p[index]
		 {
            P[index] = x;  //令p的第index位位x,即把x加入到当前排列
            hashTable[x] = true;  //记x已经在p中
            generateP(index + 1);  //处理排列的第index+1号位
            hashTable[x] = false;  //还原状态
        }
    }
}
int main()
{
    n = 3;
    generateP(1);
    return 0;
}

操作流程

先添加每个全排列的第一位,再添加第二位,此时重复的就不算,最后添加第三位。

举报

相关推荐

0 条评论