首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

递归兑现数学排列

2012-08-25 
递归实现数学排列递归,还是回溯?选择了递归,记得回溯算法,以前课程设计做的一个迷宫程序涉及到。??/* * To

递归实现数学排列

递归,还是回溯?选择了递归,记得回溯算法,以前课程设计做的一个迷宫程序涉及到。

?

?

/* * To change this template, choose Tools | Templates * and open the template in the editor. */package com.xiva.baseKnowledge;import java.util.Arrays;import java.util.LinkedHashSet;import java.util.Set;/** * @Description "4"不能在第三位,"3"与"5"不能相连 * @author XIVA */public class Arrangement {            //static int numArray[] = {1, 2, 2, 3, 4, 5};    static int numArray[] = {1, 2, 2, 3, 4, 5};    //static int[] result = {0,0,0,0,0,0};    static int[] result = new int[numArray.length];    static int index = 0;    static int count = 0;    static boolean isOut = false;    static Set arraySet = new LinkedHashSet();//存储            public static int getArrangement(int array[]){        boolean checkOut = true;        if(array.length < 1){            //System.out.print("Start:");            for(int j = 0; j < result.length; j++){                 //System.out.print(result[j]);                //业务判断过滤                if(result[j] == 4 && j == 3){                    checkOut = false;                }                                if( result[j] == 3){                    if((j>0 && result[j-1] == 5) || (j < result.length - 1 && result[j + 1] == 5)){                        checkOut = false;                    }                }            }            //System.out.println("");            isOut = true;            String reStr = Arrays.toString(result);                        //arraySet.contains(reStr)可以不需要判断            if(arraySet.contains(reStr) || !checkOut){                System.out.println(reStr);            }else{                arraySet.add(reStr);            }            count = count + 1;            return 1;        }        for(int i = 0; i < array.length; i ++){            //此处还可以简化            int[] headArray = Arrays.copyOfRange(array, 0, i);            int[] footArray  = Arrays.copyOfRange(array, i + 1, array.length);            int[] newArray = new int[headArray.length + footArray.length];                        //数组复制            System.arraycopy(headArray, 0, newArray, 0, headArray.length);            System.arraycopy(footArray, 0, newArray, headArray.length, footArray.length);            if( isOut){                index = numArray.length - array.length;                isOut = false;            }            result[index] = array[i];            index = index + 1;            //if( newArray.length > 0)            //递归调用               getArrangement(newArray);        }        return 0;    }        public static void main(String[] args){                getArrangement(numArray);        System.out.println(count);        System.out.println(arraySet.size());            }    }

?

?最终,set中存放的是类似于“[5, 4, 3, 2, 2, 1]” 的字符串。这样即使使用10以上的数进行排列,也保证了数据的正确性。

?

本题目中未加入过滤是的结果个数应该是:6!/2!

?

当然这个排列算法只考虑了排列的一种情况那就是全排列。

热点排行