首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何改进我的PHP代码以使其更高效?

如何改进我的PHP代码以使其更高效?
EN

Stack Overflow用户
提问于 2009-12-11 00:01:16
回答 11查看 508关注 0票数 0

我已经编写了一个简单的PHP脚本,用于检查某个随机值是否为有效的橄榄球联盟分数。它工作得很好,但效率不是特别高,任何关于改进它的建议都将是最受欢迎的。

代码语言:javascript
复制
$score = rand(0, 60);

/* Rugby Union
 * 
 * Try = 5 points
 * Conversion = 2 points
 * Penalty = 3 points
 * Drop goal = 3 points
 * 
 */

echo "<h1>Score: ".$score."</h1>";

for ($tries = 0; $tries <= 12; $tries++)
{
    for ($conversions = 0; $conversions <= 30; $conversions++)
    {
        for ($dropgoals = 0; $dropgoals <= 20; $dropgoals++)
        {
            if ($conversions > $tries)
            {
                //echo "<br />Illegal score";
            }
            else
            {
                $testscore = ($tries * 5) + ($conversions * 2) + ($dropgoals * 3);
                if ($testscore == $score)
                {
                    if ($dropgoals == 0)
                    {
                        echo "Found a way to achieve score with ".$tries." tries ".$conversions." conversions and ".$dropgoals." drop goals.<br />";
                    }
                    else
                    {
                        echo "Found a way to achieve score with ".$tries." tries ".$conversions." conversions and ".$dropgoals." drop goals or penalties.<br />";
                    }
                }
            }
        }
    }
}

好的,这是修改后的解决方案,如果可能的话,减少嵌套的for循环的数量是很好的……

代码语言:javascript
复制
echo "<h1>Score: ".$score."</h1>";

for ($tries = 0; $tries <= 12; $tries++) {
    for ($conversions = 0; $conversions <= $tries; $conversions++) {
        for ($dropgoals = 0; $dropgoals <= 20; $dropgoals++){
            if ($conversions <= $tries) {
                    $testscore = ($tries * 5) + ($conversions * 2) + ($dropgoals * 3);
                    if ($testscore == $score) {
                        echo "Found a way to achieve score with ".$tries." tries ".$conversions." conversions and ".$dropgoals.($dropgoals == 0 ? " drop goals.<br />" : " drop goals or penalties.<br />");
                    }
            }
        }
    }
}
EN

回答 11

Stack Overflow用户

发布于 2009-12-11 00:05:50

好的,首先

代码语言:javascript
复制
for ($conversions = 0; $conversions <= 30; $conversions++)

可以更改为

代码语言:javascript
复制
for ($conversions = 0; $conversions <= $tries; $conversions++)
票数 2
EN

Stack Overflow用户

发布于 2009-12-11 00:07:29

实际上,可能的分数只有有限的数量,对吧?在谷歌上快速搜索一下,记录是164分。那么,为什么不一次生成一个列表,列出每个可能的分数,最高可达某个最大值(300? 500?),并将其硬编码到您的应用程序中。然后,在运行时,只需检查提供的分数是否在列表中。我认为到目前为止,这将是最有效的解决方案。

编辑:如果您还想输出尝试、惩罚和丢弃目标,则此方法仍然有效--只需生成这些值--只需一次--并将它们保存在列表中(作为二维数组或关联数组)。

票数 2
EN

Stack Overflow用户

发布于 2009-12-11 00:08:52

当你说“高效”时,请定义你的意思。

代码执行是否太慢?它现在运行的速度有多快,你需要它运行多快?如果你不能定义“不够快”,那么你就没有目标。

在你猜测该加速什么之前,在这里的所有回答者鼓励你进行scattershot加速来伤害你之前,你需要分析你的代码,看看大部分时间都花在哪里了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1882007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档