热搜:NVER node 开发 php

php运行无结果,不提示错误

2024-07-27 20:50:01
php运行无结果,不提示错误

小白在做一个关于用分治策略求解最大子段和问题时,运行时没有结果,也不提示错误,看了很多遍代码也看不出哪里出问题,求大神帮忙看看!平台是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。对你的调试会很有帮助


好的谢谢前辈的经验,我会继续努力的