數學基礎:一、排列算法(遞歸)

排列採用遞歸的方式進行,算法如下:

public class Lesson7_2 {
    /**
     * @param rest-目前未排列的數據,has-保存已經排列的數據及其順序
     * @return void
     * @Description: 使用函數的遞歸(嵌套)調用,找出所有可能的排列順序
     */
    public static void permutate(List<String> has, List<String> rest, List<List<String>> result) {
        // 未(待)排列的數據爲空,說明已排列完,直接在result中保存結果
        if (rest.size() == 0) {
            result.add(has);
        } else {
            for (int i = 0; i < rest.size(); i++) {
                // 爲了不破壞遞歸前的原數據,設置臨時變量tmpHas和tmpRest來保存中間值
                List<String> tmpHas = new ArrayList<>(has);
                tmpHas.add(rest.get(i));
                // 將已準備排序的數據從未排序列表中移出
                List<String> tmpRest = new ArrayList<>(rest);
                tmpRest.remove(i);
                // 遞歸調用,對於剩餘的數據時行排列
                permutate(tmpHas, tmpRest, result);
            }
        }
    }

    public static void main(String[] args) {
        ArrayList<String> restList = new ArrayList<String>(Arrays.asList("1", "2", "3"));
        List<List<String>> resultList = new ArrayList<>();
        Lesson7_2.permutate(new ArrayList<String>(), restList, resultList);
        System.out.println(resultList);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章