zoukankan      html  css  js  c++  java
  • 全排列递归实现

    BFS一般是不会用递归的,而且很不好实现,因为是采用队列机制,而不是栈机
    制。
    但是恰恰好的,递归就是栈机制,所以递归其实就是DFS
    是栈机制啊,DFS就是栈机制

    你要是不用递归,也可以实现DFS,但是要用到栈
    递归只是使用了一个自动的栈机制


    火星十一郎

    设R= {r1,r2,r3,……,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中的元
    素的全排列记为perm(X).(ri)perm(X)表示在全排列perm(X)的每一个排列前加
    上前缀ri得到的排列,R的全排列可归纳定义如下:
    当n=1,perm(R) = (r) ,其中r是集合R中唯一的元素。
    当n>1,perm(R)由(r1)perm(R1),(r2)perm(R2),……,(rn)perm(Rn)构成。

    //该算法无法实现重拍,也就是说会重复输出

    #include <iostream>
    using namespace std;

    void swap(int a[], int i, int j)
    {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
    }

    void perm(int a[], int start, int end)
    {
    int i;
    if(start == end)//当k等于m时,表示已经递归到单个元素全排列(基本
    部分)
    {
    for(i = 0; i <= end; i++)
    cout << a[i] << " ";
    cout << endl;
    }
    else
    {
    for(i = start; i <= end; i++)
    {
    swap(a,start,i);//这里要用到两个swap,是为了不改变在
    本函数中a数组中的顺序,而进行下一个循环
    perm(a,start + 1,end);
    swap(a,start,i);
    }
    }
    }

    int main(void)
    {

    int a[5] = {1,2,3,4,5};
    perm(a,0,4);

    system("pause");
    return 0;
    }


    #include <stdio.h>
    inline void Swap(char& a, char& b)
    {// 交换a和b
    char temp = a;
    a = b;
    b = temp;
    }

    void Perm(char list[], int k, int m)
    { //生成list [k:m ]的所有排列方式
    int i;
    if (k == m) {//输出一个排列方式
    for (i = 0; i <= m; i++)
    putchar(list[i]);
    putchar('\n');
    }
    else // list[k:m ]有多个排列方式
    // 递归地产生这些排列方式
    for (i=k; i <= m; i++) {
    Swap (list[k], list[i]);
    Perm (list, k+1, m);
    Swap (list [k], list [i]);
    }
    }

    int main()
    {
    char s[]="123";
    Perm(s, 0, 2);
    return 0;
    }

  • 相关阅读:
    TuShare接口适应
    任泽平金句记录
    分红送股---要注意的两个日期
    解决github无法登录的问题
    持久斗争
    正则语法
    JWT的结构
    付鹏的黄金分析框架
    vscode设置背景图片
    Ubuntu 16.04安装Nginx
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2444316.html
Copyright © 2011-2022 走看看