今天看到了一道很有意思的题目:假如有一只羊,第3年第4年的时候,可以各生一只小羊;第5年死亡;小羊养到第3年和第4年的时候,也可以各生一只小羊,第5年死亡。问10年之后,拥有多少只小羊?
刚看到这道问题,就想到了一个方法:
<?php
function sheep($int, $year) {
$arr = array();
for ($i=1; $i<=$int; $i++) {
$arr[] = 1;
}
for ($j=1; $j<$year; $j++) {
foreach ($arr as $k=>$v) {
$arr[$k] += 1;
if ($arr[$k]==3)
$arr[] = 1;
elseif ($arr[$k]==4)
$arr[] = 1;
elseif ($arr[$k]==5)
unset($arr[$k]);
}
}
return count($arr).'</br>';
}
?>
在现有的条件下,可以实现想要的功能。但是在年份比较多的情况下,循环次数增加,数组成员剧增,内存直接报警,50年就超过了128M内存,所以这个方法绝对是不适用的。
仔细思考了一下,羊在第5年就死亡了,也就是说只能活到四岁,那么就把同龄的羊归类到一起不就可以了,那就从一个几百万成员的大数组,变成了只有四个成员的数组。
<?php
function new_sheep($int, $year) {
$arr = array($int,0,0,0,0);
for ($i=1; $i<$year; $i++) {
list($one,$two,$three,$four,$five)= $arr;
$arr[0] = $two + $three;
$arr[1] = $one ;
$arr[2] = $two;
$arr[3] = $three;
}
return ($arr[0]+$arr[1]+$arr[2]+$arr[3]);
}
?>
再测试了一下,没有内存溢出的提示了。
题目本身并不是很难的题,甚至都称不上编程的题目。但就这样的一个题目,仔细思考一下,就能把性能优化这么多。可见平时开发过程中、遇到的的功能模块,一定要多去思考解决方案、多去学习成熟的解决思路!每次完成一个功能,都要及时的进行总结,不能让自己的项目经验变成项目经历