- 分而治之(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)) } }