1. 程式人生 > >全排列遞迴方法

全排列遞迴方法

(一)遞迴的全排列演算法

(A、B、C、D)的全排列為

1、A後面跟(B、C、D)的全排列

2、B後面跟(A、C、D)的全排列(A與B交換,其他次序保持不變

3、C後面跟(B、A、D)的全排列(A與C交換,其他次序保持不變)

4、D後面跟(B、C、A)的全排列(A與D交換,其他次序保持不變)

用數字舉例方便點:

1234
1243
1324
1342
1432
1423
2134
....
3214
3214
3241
3124
3142
3412
3421
4231

為觀察規律,僅僅標紅1234全排列中最高位首次1,2,3,4的排列。

解釋

以1234為基礎(程式碼中第二次交換的意義)

同為第一層遞迴的4種狀態分別為:

第一位和第一位交換(1234==》1234);

第一位和第二位交換(1234==》2134);

第一位和第三位交換(1234==》3214);

第一位和第四位交換(1234==》4231)。

為保證普遍性,選第三種狀態繼續遞迴:

以3214為基礎同為第二層遞迴的三種狀態分別為:

第二位和第二位交換(3214==》3214);

第二位和第三位交換(3214==》3124);

第二位和第四位交換(3214==》3412)。

繼續遞迴即可。

程式碼:

#include <iostream>
#include <cstdio>
using namespace std;

void permutation(int k, int n, int a[])
{
    //遞迴到底層
    if(k == n-1)
    {
        for(int i = 0; i < n; i ++)
            printf("%d", a[i]);
        printf("\n");
    }
    else
    {
        for(int i = k; i < n; i ++)
        {
            int temp = a[k];
            a[k] = a[i];
            a[i] = temp;

            //交換後遞迴下一層
            permutation(k+1, n, a);

            //保證每一層遞迴後保持上一層的順序
            temp = a[k];
            a[k] = a[i];
            a[i] = temp;
        }
    }
}
int main()
{
    int a[100];
    int n;
    scanf("%d", &n);

    for(int i = 0; i < n; i ++)
        a[i] = i+1;

    permutation(0, n, a);
    return 0;
}

相關推薦

排列方法

(一)遞迴的全排列演算法 (A、B、C、D)的全排列為 1、A後面跟(B、C、D)的全排列 2、B後面跟(A、C、D)的全排列(A與B交換,其他次序保持不變) 3、C後面跟(B、A、D)的全排列

排列演算法

遞迴求全排列演算法: 例如:char a[]=”abc”  ,(i,j,k)表示陣列現有的元素 perm(a,k,m);//從陣列下標k到m的全排列 k==m 只剩一個元素為遞迴出口 C++原始碼: #include <iostre

排列-去重複實現-非DFS

import java.util.*; public class Quanpaifeidigui { public static void main(String args[]){ Scanner in=new Scanner(System.in); whil

排列-(不含去重複的操作)非DFS

import java.util.*; public class Quanpaifeidigui { public static void main(String args[]){ Scanner in=new Scanner(System.in); whil

排列+演算法的解決

1.問題介紹 全排列就是輸出一個序列的所有可能排列{a,b}的可能排列為{a,b},{b,a}; {1,2,3}的全排列為{1,2,3}、{1,3,2}、{2,1,3}、{2,3,1}、{3,2,1}、{3,1,2}。想必大家都理解了全排列,這裡就不再列舉其他情

排列 (非字典序) 深搜(字典序)

全排列問題初探,不含重複元素情況的討論。 糊的題目: 【題目描述】 給定一個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且給定的字串中的字母已經按照從小到大的順

python 排列 中的兩種實現

我所知道的全排列有四種: 1.迭代的排列組合全排列(非遞迴):字典序的大小,即傳說中的A33 2.鄰位置對換的全排列(非遞迴): 方法一:生成下一個排列,該方法對重複元素同樣有效 如果可以根據一個排列生成他的下一個排列,那麼生成所有排列也就不在話下了,下面以排列625431

排列演算法詳解

一、概述 全排列在很多程式都有應用,是一個很常見的演算法,常規的演算法是一種遞迴的演算法,這種演算法的得到基於以下的分析思路。 給定一個具有n個元素的集合(n>=1),要求輸出這個集合中元素的所有可能的排列。 二、遞迴實現 2.1、例項一

演算法01:排列演算法

全排列是指n個元素按一定順序的所有排列組合,如{1,2,3}三個元素的全排列為{1,2,3}、{1,3,2}、{2,1,3}、{2,3,1}、{3,1,2}、{3,2,1}共3!種。 常見排列的演算法一般有: (1)遞迴法 (2)字典序法 (3)鄰位對換法 (4)遞增進位

排列實現

#include <iostream> using namespace std; void swap(int &a,int &b){ int temp=a; a=b; b=temp; } void perm(int lis

字串排列-實現

一個演算法命題:給定字串S[0…N-1],設計演算法,列舉S的全排列。如:123,全排列就是:123,132,213,231,312,321 演算法思考 根據遞迴的特點,深度劃分子邏輯-遞迴,標識出口。全排列一個思維:對待全排序的序列中從左選定一個數作為基數,然後對他右邊

n的排列演算法

思路: 可以通過遞迴的方法把n的全排列問題轉化為n-1的全排列問題,逐漸推導到一個數字的全排列,顯然一個數字的全排列方式只有一種,下面就展示實現該過程的實現程式碼: #include <iostream> using namespace std; void s

排列演算法(C++實現)

演算法實現思路 遞迴解決問題的方法就是將一個大問題不斷分解成小問題,直到小問題很容易解決為止 先看全排列怎麼分解成小問題:        假設要全排列“ABC”,先把A作為前部不變,全排列BC,同樣將B作為前部,全排列C,顯然是它本身 於是大問題變成了很容易解決的小問題了

排列思想

簡單地說:就是第一個數分別以後面的數進行交換 E.g:E = (a , b , c),則 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b) 然後a.perm(b,c)= ab.perm(c)+ ac.perm(

排列解析【方法

定義          從n個元素中取出m個元素進行排列,當n=m時這個排列被稱為全排列。 遞迴法           我們要對前n個數進行全排列,那麼首先我們可以發現第一位數可以是1~n中的任意一位,列舉第一位數的n種可能,然後我們就可以再去求剩下n-1位,確定第二位

排列的實現方法--&字典序

一:背景 全排列在很多筆試都有應用,是一個很常見的演算法,關於這類的題目變化很多。這種演算法的得到基於以下的分析思路。  給定一個具有n個元素的集合(n>=1),要求輸出這個集合中元素的所有可能的排列。 例如:給定{1,2,3},全排列為3!個,即: {1,2,3},

python 方法 斐波那契數列—漢諾塔

#普通方法生成 def feibo(n): a,b=0,1 print('0,1',end='') for i in range(n-1): a,b=b,a+b print(',{0}'.format(b),end='') #遞迴方法生成 def

方法計算斐波那契數列

參考: https://blog.csdn.net/xuzhangze/article/details/78568702 波那契數列數列從第3項開始,每一項都等於前兩項之和。即 第n項的值為  (n-1) + (n-2) 例如:數列 1, 1, 2, 3, 5, 8, 13, 21

方法輸出目錄下所有的檔名

# !/bin/bash function echo_name() { #shell會執行反引號中的內容(命令) for file in `ls $1` do if [ -d $1'/'$file ] then echo_name $1'/'$file else ech

猴子吃桃問題,用和非方法

猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。   public class Test{ &nb