分治法:即分而治之,把一个复杂的问题分成两个或更多相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解为子问题解的合并。
本文讲解用JavaScript实现分治法。
①简单方法,通俗易懂
//定义数组
var arr = [120, 34, 56, 17, 234, 12];
/* arr:数组
* start:数组起始下标
* end:数组结束下标
**/
//获取数组最大值
function getMax(arr, start, end){
if(start == end){
return arr[start];
}else{
var mid = parseInt( (start + end)/2 );
var prev = getMax(arr, start, mid);
var next = getMax(arr, mid + 1, end);
return prev > next ? prev : next;
}
}
//获取数组最小值
function getMin(arr, start, end){
if(start == end){
return arr[start];
}else{
var mid = parseInt( (start + end)/2 );
var prev = getMin(arr, start, mid);
var next = getMin(arr, mid + 1, end);
return prev > next ? next : prev;
}
}
console.log("max=" + getMax(arr, 0, 5));
console.log("min=" + getMin(arr, 0, 5));
②归并为一个函数
//定义数组
var arr = [120, 34, 56, 17, 234, 12];
/* arr:数组
* start:数组起始下标
* end:数组结束下标
* method:获取最大值还是最小值,1表示最大值,0表示最小值
**/
//获取数组最大值
function getMaxOrMin(arr, start, end, method){
if(start == end){
return arr[start];
}else{
var mid = parseInt( (start + end)/2 );
var prev = arguments.callee(arr, start, mid, method);
var next = arguments.callee(arr, mid + 1, end, method);
if(method){
return prev > next ? prev : next;
}else{
return prev > next ? next : prev;
}
}
}
console.log("max=" + getMaxOrMin(arr, 0, 5, 1));
console.log("min=" + getMaxOrMin(arr, 0, 5, 0));
这个方法的比之第一个方法,代码更紧凑,值得说明的是,arguments.callee()方法,该方法的作用是指向当前函数,所以我们用该方法实现了递归调用。