我已经编写了一个简单的PHP脚本,用于检查某个随机值是否为有效的橄榄球联盟分数。它工作得很好,但效率不是特别高,任何关于改进它的建议都将是最受欢迎的。
$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循环的数量是很好的……
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 />");
}
}
}
}
}发布于 2009-12-11 00:05:50
好的,首先
for ($conversions = 0; $conversions <= 30; $conversions++)可以更改为
for ($conversions = 0; $conversions <= $tries; $conversions++)发布于 2009-12-11 00:07:29
实际上,可能的分数只有有限的数量,对吧?在谷歌上快速搜索一下,记录是164分。那么,为什么不一次生成一个列表,列出每个可能的分数,最高可达某个最大值(300? 500?),并将其硬编码到您的应用程序中。然后,在运行时,只需检查提供的分数是否在列表中。我认为到目前为止,这将是最有效的解决方案。
编辑:如果您还想输出尝试、惩罚和丢弃目标,则此方法仍然有效--只需生成这些值--只需一次--并将它们保存在列表中(作为二维数组或关联数组)。
发布于 2009-12-11 00:08:52
当你说“高效”时,请定义你的意思。
代码执行是否太慢?它现在运行的速度有多快,你需要它运行多快?如果你不能定义“不够快”,那么你就没有目标。
在你猜测该加速什么之前,在这里的所有回答者鼓励你进行scattershot加速来伤害你之前,你需要分析你的代码,看看大部分时间都花在哪里了。
https://stackoverflow.com/questions/1882007
复制相似问题