遞迴解決全排列問題
排列:從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列;
全排列:當n==m時,稱為全排列;假設:集合{ 1,2,3}的全排列為:
{ 1 2 3}
{ 1 3 2 }
{ 2 1 3 }
{ 2 3 1 }
{ 3 2 1 }
{ 3 1 2 }
我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為{1,2,3}的排列列舉樹,此樹和我們這裡介紹的演算法完全一致;
演算法思路:
(1)n個元素的全排列=(n-1個元素的全排列)+(另一個元素作為字首);
(2)出口:如果只有一個元素的全排列,則說明已經排完,則輸出陣列;
(3)不斷將每個元素放作第一個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;
package test;
public class Perm {
public static void perm(Object[] list,int k,int m){
if(k==m){ //當只有一個元素時,輸出陣列
for(int i=0;i<=m;i++){
System.out.print(list[i]+" ");
}
System.out.println();
}
else{
for(int i=k;i<=m;i++){
list = MyMath.swap(list,k,i); //for迴圈將陣列從頭到尾的每一個數一次放到最前面
perm(list,k+1,m); //確定第一個元素,開始遞迴k+1到結束的數
list = MyMath.swap(list, k, i); //還原換過的數
}
}
}
public static void main(String[] args) {
Object[] list = {1,2,3};
perm(list, 0, 2);
}
}
package test;
public class MyMath {
//調換list中k和i下表元素的值
public static Object[] swap(Object[] list, int k, int i) {
// TODO Auto-generated method stub
Object temp = list[k];
list[k]=list[i];
list[i]=temp;
return list;
}
}
相關文章
- 回溯法解決全排列問題總結
- 【演算法】遞迴實現全排列演算法遞迴
- 遞迴思想----解決飲料問題遞迴
- Josephus問題解決方法五(遞迴)遞迴
- 全排列的實現之遞迴版與迭代版遞迴
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- js陣列全排列問題JS陣列
- 以Top-Down思維去解決問題——遞迴遞迴
- Java解決遞迴造成的堆疊溢位問題Java遞迴
- [演算法]全排列類問題演算法
- 全排列價值(數學問題)
- php對陣列進行全排列的非遞迴演算法PHP陣列遞迴演算法
- 遞迴路徑問題遞迴
- Day 28 | 491.遞增子序列 、46.全排列、 47.全排列 II
- 回溯法(排列樹)解決八(N)皇后問題
- python3:遞迴解漢諾塔問題Python遞迴
- 樹遞迴問題的求解遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 遞迴實現漢諾塔問題遞迴
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 經典遞迴解決漢諾塔!遞迴
- 微信小程式支付全問題解決微信小程式
- 使用回溯演算法解決N皇后問題以及間隔排列問題演算法
- 排列 題解
- js使用遞迴回溯法解八皇后問題程式碼分享JS遞迴
- rake 任務引數傳遞問題解決
- 遞迴演算法實踐---實現排列組合遞迴演算法
- Josephus問題解決方法四(迴圈陣列)陣列
- 解決「問題」,不要解決問題
- 解決CORS跨域不能傳遞cookies的問題CORS跨域Cookie
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.3 題解:機器人走方格問題遞迴機器人
- 請教一個關於全排列的演算法問題?演算法
- 字串全排列字串
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- C#中漢諾塔問題的遞迴解法C#遞迴
- 如何在 iOS 中解決迴圈引用的問題iOS