全排列遞迴方法
(一)遞迴的全排列演算法
(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為基礎(程式碼中第二次交換的意義)
第一位和第一位交換(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