递归在于反复调用自身函数
这里就不说概念了,自己搜一搜全都有。
一、使用递归需要:
①递归边界(尽头,防止函数无休止的调用)
②递归式(将问题分解成子问题的手段)
二、回溯全排列
还有一种是斐波那契函数,这里就不说了。
全排列是什么?
把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;
}
操作流程
先添加每个全排列的第一位,再添加第二位,此时重复的就不算,最后添加第三位。