- 分而治之(divide and conquer,D&C)一种递归式问题解决方法。
工作原理:
1.找出简单的基线条件;
2.确定如何缩小问题的规模,使其符合基线条件;
备注:
涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。
/* 求和 */
function sum(arr, num) {
var len = arr.length
if (len <= 1) {
return arr[0] + num
} else {
var pop = num + arr.pop()
return sum(arr, pop)
}
}
console.log(sum([
1, 2, 3, 4
], 0));
//10
/* 获取总个数 */
function total(obj, all) {
var len = obj.length;
if (len <= 1) {
return all + 1
} else {
obj.pop()
return total(obj, (all + 1))
}
}
console.log(total([
2, 3, 5, 1, 2
], 0));
//5
/* 最大数 */
function maxNum(arr, max) {
var len = arr.length;
if (len <= 1) {
if (arr[0] >= max) {
return arr[0]
}
return max
} else if (arr[0] <= max) {
arr.shift()
return maxNum(arr, max)
} else if (arr[0] > max) {
max = arr[0]
arr.shift()
return maxNum(arr, max)
}
}
console.log(maxNum([
0, 12, 6, 9
], 0));
//12
- 快速排序
/* 第一个元素作为基线条件 */
function quickSort2(array) {
var len = array.length;
if (len < 2) {
return array
} else {
var arr = array[0];
var less = [];
var greater = [];
array.forEach(function(i, index) {
if (index > 0) {
if (i <= arr) {
less.push(i)
} else if (i > arr) {
greater.push(i)
}
}
})
return quickSort2(less).concat([arr], quickSort2(greater))
}
}
/* 中间元素作为基线,更适用于有顺序的数组,减少栈的个数 */
function quickSort(array) {
var len = array.length;
if (len < 2) {
return array
} else {
var j = parseInt((len + 1) / 2);
var arr = array[j];
var less = [];
var greater = [];
array.forEach(function(i, index) {
if (index !== j) {
if (i <= arr) {
less.push(i)
} else if (i > arr) {
greater.push(i)
}
}
})
return quickSort(less).concat([arr], quickSort(greater))
}
}
