小白在做一个关于用分治策略求解最大子段和问题时,运行时没有结果,也不提示错误,看了很多遍代码也看不出哪里出问题,求大神帮忙看看!平台是zendstudio。
<?phpfunction DC_max($arr,$left,$right){ $max=0; $l=0; $ls=0; $r=0; $rs=0; if ($left==$right){ if ($arr[$left]>0) {$max=$arr[$left];} else $max=0; } else { $center=round(($left+$right)/2); $leftmax=DC_max($arr,$left,$center); $rightmax=DC_max($arr,$center+1,$right); for ($i=$center;$i>=$left;$i--){ $ls+=$arr[$i]; if ($ls>$l) $l=$ls; } for ($j=$center+1;$j<=$right;$j++){ $rs+=$arr[$j]; if ($rs>$r) $r=$rs; } $max=$l+$r; if ($leftmax>$max) $max=$leftmax; if ($rightmax>$max) $max=$rightmax; } return $max;}$arr=array("-2","11","-4","13","-5","-2");$starttime2=microtime(true);echo "采用分治算法时最大子段和为".DC_max($arr,0,6)."";$endtime2=microtime(true);$total2=$endtime2-$starttime2;echo "所用时间为".$total2."秒";?>
回复讨论(解决方案)
打开 php 的错误显示功能,你就可以看到出现死循环了(内存耗尽)
打开 php 的错误显示功能,你就可以看到出现死循环了(内存耗尽)
求问大神,我在文件头部加上
ini_set("display_errors", "On");error_reporting(E_ALL | E_STRICT);
可是结果还是一样没有提示。求问大神哪里出现死循环了,小白看了一个晚上都没看出来
直接运行你的代码,会有错误
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 65488 bytes) in .....
显然是在递归中把内存耗尽了
在函数入口处观察传入参数
function DC_max($arr,$left,$right){
echo "$left,$right
";
会有
0,6
0,3
0,2
0,1
0,1
0,1
0,1
0,1
0,1
......
显然是死循环了
把 if ($left==$right){
改为 if ($left==$right || abs($left - $right) == 1){
会有
0,6
0,3
0,2
0,1
2,2
3,3
4,6
4,5
6,6
Notice: Undefined offset: 6 in
死循环消失了,但下标越界了
加上 error_reporting(E_ALL ^ E_NOTICE);
得
0,6
0,3
0,2
0,1
2,2
3,3
4,6
4,5
6,6
采用分治算法时最大子段和为20
所用时间为0秒
显然代码是不健壮的,很难说在什么情况下会得不到正确的结果
直接运行你的代码,会有错误
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 65488 bytes) in .....
显然是在递归中把内存耗尽了
在函数入口处观察传入参数
function DC_max($arr,$left,$right){
echo "$left,$right
";
会有
0,6
0,3
0,2
0,1
0,1
0,1
0,1
0,1
0,1
......
显然是死循环了
把 if ($left==$right){
改为 if ($left==$right || abs($left - $right) == 1){
会有
0,6
0,3
0,2
0,1
2,2
3,3
4,6
4,5
6,6
Notice: Undefined offset: 6 in
死循环消失了,但下标越界了
加上 error_reporting(E_ALL ^ E_NOTICE);
得
0,6
0,3
0,2
0,1
2,2
3,3
4,6
4,5
6,6
采用分治算法时最大子段和为20
所用时间为0秒
显然代码是不健壮的,很难说在什么情况下会得不到正确的结果
大神你好,不知道为什么在用您这个办法改了之后我这边还是不行,不过经过您的提示我感觉好像是$center那里的取值出问题,所以我把round函数改成了下取整函数floor,这时候上面的边界不改也是可以运行的。谢谢大神的指导,小白刚刚自学什么都不懂,希望能以后多像大神们学习。
在各种关键位置echo,exit。对你的调试会很有帮助
在各种关键位置echo,exit。对你的调试会很有帮助
好的谢谢前辈的经验,我会继续努力的