算法笔记——一张A4纸让你看懂递归全排列

唉,这个问题我想了一天半,一直没想通,哈啊哈哈哈。

今天动手画了画图,把程序走了一遍,才搞出来,但对于递归还是不太理解,这个算法,最好画一遍图,自己走一遍。要不然真的容易绕进去。本人是一个菜鸡,之前参加学校的ACM纳新赛惨遭淘汰,现在自学算法,唉,给自己加加油,说不定我就是下一个大佬呢,人可以不强大,但一定要有梦想,梦想看起来很扯淡,不扯淡那还叫梦想???(手动滑稽~)

全排列指的是n个整数的所有排列,按从小到大的顺序输出n个整数的全排列,其中(a1,a2,…ana1,a2,…an)的顺序小于(b1,b2…bnb1,b2…bn):a1=b1,a2=b2…an=bn,ai<bia1=b1,a2=b2…an=bn,ai<bi
举个例子:(1 - 3)的从小到大的顺序全排列:
(1,2,3),(1,3,2),(2,1,3),(2,3,1)(3,1,2),(3,2,1)
从分治的角度考虑,可以划分为多个子问题,"1开头的全排列","2开头的全排列"... P[ ] 存放当前排列
hashtable[x]:当x在当前的排列P中时,hashtable[x] = true;

#include<iostream>
using namespace std;
const int Max=11;
int n,HashTable[Max]={false},P[Max];
void generateA(int index)
{
    if(index==n+1)
    {
        for(int i=1;i<=n;i++)
            cout<<P[i];
            cout<<endl;
            return;//此时程序终止,函数不再往下执行
    }
    for(int i=1;i<=n;i++)
    {
        if(HashTable[i]==false)
        {
            cout<<"hash"<<i<<endl;
            P[index]=i;
            HashTable[i]=true;
            generateA(index+1);
            HashTable[i]=false;
        }
    }
}
int main()
{
    n=3;
    generateA(1);
    return 0;
}

唉,凑合着看吧,能看懂就行,毕竟我查了一遍,CSDN上目前还没得人这么搞这个算法的图解(手动滑稽~)

在这里插入图片描述
快期末了,可能最近会更新的少一些,不说了,学习!
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/106267482