关于js代码的一个问题想不出为什么,求大神解释

//分治思想:先分再治
function maxSubSum(arr,left,right){
//console.log(right);
var leftMaxSum = rightMaxSum = 0;
//将这俩行代码放这里就会出错,是因为什么?
// var leftMaxBorderSum = rightMaxBorderSum = 0;
// var lefttemp = righttemp = 0;
if(left == right){
if(arr[left] > 0){
return arr[left];
}else{
return 0;
}
}
var center = Math.floor((left + right)/2);
var leftMaxSum = maxSubSum(arr,left,center);
var rightMaxSum = maxSubSum(arr,center+1,right);
//把代码放这里就不会出错,是因为什么?
var leftMaxBorderSum = rightMaxBorderSum = 0;
var lefttemp = righttemp = 0;
for(var i=center; i>=left; i--){
lefttemp += arr[i];
if(lefttemp >= leftMaxBorderSum){
leftMaxBorderSum = lefttemp;
}
}
for(var j=center+1; j<=right; j++){
righttemp += arr[j];
//console.log(j);
if(righttemp >= rightMaxBorderSum){
rightMaxBorderSum = righttemp;
}
}
console.log('['+left+','+right+']');
console.log(center+','+leftMaxSum+','+rightMaxSum+','+ (leftMaxBorderSum + rightMaxBorderSum));
return Math.max(leftMaxSum,rightMaxSum,(leftMaxBorderSum + rightMaxBorderSum));
}
var arr = [4,-3,5,-2,-1,2,6,-2];
console.log(maxSubSum(arr,0,7));
这个主要用分治法实现求一个数列的最大子序列和的问题,具体问题在代码里标注了,求大神解释#前端#
全部评论
我说的出错是指无法输出正确答案。当把赋值语句放到递归调用之前,最后的答案就会出错。当把赋值语句放到递归调用之后,就会输出正确答案
点赞 回复 分享
发布于 2018-03-21 13:31
function maxSubSum(arr,left,right){ //console.log(right); var leftMaxSum = rightMaxSum = 0; //将这俩行代码放这里就会出错,是因为什么? // var leftMaxBorderSum = rightMaxBorderSum = 0; // var lefttemp = righttemp = 0; if(left == right){ if(arr[left] > 0){ return arr[left]; }else{ return 0; } } var center = Math.floor((left + right)/2); var leftMaxSum = maxSubSum(arr,left,center); var rightMaxSum = maxSubSum(arr,center+1,right); //console.log(leftMaxBorderSum,rightMaxBorderSum); //把代码放这里就不会出错,是因为什么? var leftMaxBorderSum = rightMaxBorderSum = 0; var lefttemp = righttemp = 0; for(var i=center; i>=left; i--){ lefttemp += arr[i]; if(lefttemp >= leftMaxBorderSum){ leftMaxBorderSum = lefttemp; } } for(var j=center+1; j<=right; j++){ righttemp += arr[j]; //console.log(j); if(righttemp >= rightMaxBorderSum){ rightMaxBorderSum = righttemp; } } console.log('['+left+','+right+']'); console.log(center+','+leftMaxSum+','+rightMaxSum+','+ (leftMaxBorderSum + rightMaxBorderSum)); return Math.max(leftMaxSum,rightMaxSum,(leftMaxBorderSum + rightMaxBorderSum)); } var arr = [4,-3,5,-2,-1,2,6,-2]; console.log(maxSubSum(arr,0,7));
点赞 回复 分享
发布于 2018-03-21 13:33
 var leftMaxSum = rightMaxSum = 0; var lefttemp = righttemp = 0; 下面还没仔细看,但是这么写已经污染了全部变量。
点赞 回复 分享
发布于 2018-03-21 14:26

相关推荐

头发暂时没有的KFC总裁:找廉价劳动力罢了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务