一、背景
leetCode有道很经典的题目:给定一个不含重复数字的nums,返回其所有可能的全排列,具体要求如下图:
二、分析
1、分析:这道题来自数学中的排列组合,最简单的方法就是用列举法一一列举出来,那么我们编程中如何列举呢?
//arr = [1,2,3]从这个数组出发分析
步骤:
1、首先从数组中取出第一项 1 作为新数组的第一项,剩下数组[2,3]再进行排列
组合,在数组[2,3]中取出第一项,剩下的排列组合,依照以上方法直到数组只剩
下一项;也就是:
[1,2,3] =>1 [2,3] => 1 2 [3] =>1,2,3
2、使用第一步,也只能得到一种结果,因此我们需要将元素替换位置就能得出其
他可能。
如:
[1,2,3] =>1 [2,3] => 1 2 [3] =>1,2,3
[1,2,3] =>1 [3,2] => 1 3 [2] =>1,3,2
3、最后循环原数组,将三项依次作为第一项
4、从上面步骤很容易就能看出来,需要用到循环和递归的方法
因此编程中列举无疑就是要用到递归的方法。下面就使用递归来解决这道题。
三、实现
1、使用循环和递归
let rankArr = (array) => {
let result = []
arrange = (array, index =0) => {
let arr = Array.from(array)
if (index == arr.length - 1) {
result.push(arr) //只剩最后一项时,得出数组
}
for (let i = index; i < arr.length; i++) {
[arr[i], arr[index]] = [arr[index], arr[i]]; //元素调换位置
arrange(arr, index + 1); //递归
[arr[i], arr[index]] = [arr[index], arr[i]]; //回溯(返回原来数组)
}
}
arrange(array)
return result
}