今天在玩Hashell的时候,学到列表的内涵,计算a,b100以内所有的勾股数,发现速度很慢,要1分多才能算完所有的数,于是想到是不是算法本身的问题,这个问题本身决定它无法快速的运算,用PHP试了一个,写出如下代码:
1
<?php
2
3
for (;$a<100;$a++)
4
5
{
6
7
for($b=$a;$b<100;$b++)
8
9
{
10
11
$c=sqrt(pow($a,2)+pow($b,2));
12
13
if($c==(int)$c) echo "$a $b $c<br/>";
14
15
16
17
}
18
19
}
20
21
echo "end";
22
23
?>
24
25
PHP只用了不到一秒的时间就搞定了问题.才发现Haskell效率实在太低.但我看了一下PHP运行结果,发现了有趣的结果,如下:
0
1 1
2 2
(此段为 a a 形式数,直到99 99)
99 99
3 4 5
(此段为正确结果,不列出)
80 84 116
end
开头的0,1 1,2 2……是怎么回事?
回到代码,看一下第一个循环:
for (;$a<100;$a++)
发现此处少写
$a=1
改完后正常(此代码初有变量声明,后删之,忘记加上,才出现些错误)
回头想一下出现原因.变量$a没有初始化,那么$b是什么?因为PHP的动态内存管理机制,在
$b=$a
时只是传递了$a的引用,并没有分配新的内存单元,那么是与$a完全相同的类型,也为NULL.
$c=sqrt(pow($a,2)+pow($b,2));
此名传递参数类型错误,但PHP没有给出任何错误提示,执行结果是$c为0.
下一步,$b++,$b初值为NULL,自增后为1,把它当做0处理了.