递归调用(JAVA)之后“撤消”步骤的目的是什么?

时间:2018-07-16 02:14:50

标签: java recursion permutation

这是一个片段,用于创建整数数组的所有可能排列。我特别想知道从tempList中删除最后一个元素时该行的用途。我曾尝试在各处添加打印语句,但是从概念上讲,我仍然不了解发生的递归回溯。

public List<List<Integer>> permute(int[] nums) {
   List<List<Integer>> list = new ArrayList<>();
   // Arrays.sort(nums); // not necessary
   backtrack(list, new ArrayList<>(), nums);
   return list;
}

private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
   if(tempList.size() == nums.length){
      list.add(new ArrayList<>(tempList));
   } else{
      for(int i = 0; i < nums.length; i++){ 
         if(tempList.contains(nums[i])) continue; // element already exists, skip
         tempList.add(nums[i]);
         backtrack(list, tempList, nums);
         tempList.remove(tempList.size() - 1);
      }
   }
} 

1 个答案:

答案 0 :(得分:0)

这是您的angular.module('myModule', []) .component('list', { template: '<h1>Hello from List.js</h1>' '<ul>' + '<li>1</li>' + '<li>2</li>' + '</ul>' }) 函数的作用:

1)检查当前列表的长度是否与总数相同,这意味着将所有数字都添加到列表中。在这种情况下,请以相同的顺序创建一个新列表,并将其添加到列表的最终列表中,然后从当前递归调用中返回。

2)遍历所有数字,并检查该列表中是否不存在任何数字。这就是列表中存在所有数字的原因,继续在那里,这会跳过循环。如果所有数字都已经存在,它将从现有的递归调用中返回。

3)在列表中添加不存在的号码,然后再次调用backtrack,它将再次执行1号和2号

4)一旦达到一种情况,所有数字都由1进行了某种排列加法,最后一行将从backtrack中删除当前递归调用所添加的数,因此相同的列表可用于其他不同排列。删除后,它将返回上一个递归调用。

当我执行tempList

的一个小示例时,它就是这样运行的
{1,2,3}