1.递归的定义
递归就是函数自己调用自己。
递归需要有出口return,不然会栈溢出。
1 2 3 4
| function fun(){ fun() } fun()
|
可以实现类似阶乘的算法
1 2 3 4 5 6 7 8
| function func(n){ if (n === 1){ return 1; } return n * func(n-1); } func(5)
|
还有斐波拉契数列: 1, 1, 2, 3, 5, 8, 13, 21
1 2 3 4 5 6 7
| function fib (n){ if(n<=2){ return 1; } return fib(n-1) + fib(n-2); } fib(5);
|
A(3,3)=6
result: [1,2,3] —>
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
####(1)递归交换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
function swap(arr,i,j) { if(i!=j) { var temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } let newArr = []; function perm(arr) { (function fn(n) { for(var i=n;i<arr.length;i++) { swap(arr,i,n); if(n+1<arr.length-1){ fn(n+1); } else { console.log(newArr) newArr.push(arr); } swap(arr,i,n); } })(0); } perm([1,2,3,4]);
|
(2).递归链接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
function perm(arr) { let newArr = []; (function fn(source, result) { if (source.length == 0) newArr.push(result) else for (var i = 0; i < source.length; i++) fn(source.slice(0, i).concat(source.slice(i + 1)), result.concat(source[i])); })(arr, []); return newArr } perm([1,2,3,4]);
|
(3).递归回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
var count = 0; function show(arr) { document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />"); } function seek(index, n) { if (n >= 0) if (index[n] < index.length - 1) { index[n]++; if ((function () { for (var i = 0; i < n; i++) if (index[i] == index[n]) return true; return false; })()) return seek(index, n); else return true; } else { index[n] = -1; if (seek(index, n - 1)) return seek(index, n); else return false; } else return false; } function perm(arr) { var index = new Array(arr.length); for (var i = 0; i < index.length; i++) index[i] = -1; for (i = 0; i < index.length - 1; i++) seek(index, i); while (seek(index, index.length - 1)) { var temp = []; for (i = 0; i < index.length; i++) temp.push(arr[index[i]]); show(temp); } } perm(["e1", "e2", "e3", "e4"]);
|
(4).非递归回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
var count = 0; function show(arr) { document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />"); } function seek(index, n) { var flag = false, m = n; do { index[n]++; if (index[n] == index.length) index[n--] = -1; else if (!(function () { for (var i = 0; i < n; i++) if (index[i] == index[n]) return true; return false; })()) if (m == n) flag = true; else n++; } while (!flag && n >= 0) return flag; } function perm(arr) { var index = new Array(arr.length); for (var i = 0; i < index.length; i++) index[i] = -1; for (i = 0; i < index.length - 1; i++) seek(index, i); while (seek(index, index.length - 1)) { var temp = []; for (i = 0; i < index.length; i++) temp.push(arr[index[i]]); show(temp); } } perm(["e1", "e2", "e3", "e4"]);
|
(5).非递归求顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
var count = 0; function show(arr) { document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />"); } function swap(arr, i, j) { var t = arr[i]; arr[i] = arr[j]; arr[j] = t;
} function sort(index) { for (var j = index.length - 2; j >= 0 && index[j] > index[j + 1]; j--) ; if (j < 0) return false; for (var k = index.length - 1; index[k] < index[j]; k--) ; swap(index, j, k); for (j = j + 1, k = index.length - 1; j < k; j++, k--) swap(index, j, k); return true; } function perm(arr) { var index = new Array(arr.length); for (var i = 0; i < index.length; i++) index[i] = i; do { var temp = []; for (i = 0; i < index.length; i++) temp.push(arr[index[i]]); show(temp); } while (sort(index)); } perm(["e1", "e2", "e3", "e4"]);
|
(6).非递归求模
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
var count = 0; function show(arr) { document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />"); } function perm(arr) { var result = new Array(arr.length); var fac = 1; for (var i = 2; i <= arr.length; i++) fac *= i; for (index = 0; index < fac; index++) { var t = index; for (i = 1; i <= arr.length; i++) { var w = t % i; for (j = i - 1; j > w; j--) result[j] = result[j - 1]; result[w] = arr[i - 1]; t = Math.floor(t / i); } show(result); } } perm(["e1", "e2", "e3", "e4"]);
|