[Haskell-cafe] newbie optimization question
Tillmann Rendel
rendel at rbg.informatik.tu-darmstadt.de
Sun Oct 28 15:41:19 EDT 2007
Hi,
Prabhakar Ragde wrote:
> divisors i = [j | j<-[1..i-1], i `mod` j == 0]
> main = print [i | i<-[1..10000], i == sum (divisors i)]
Jerzy Karczmarczuk wrote:
> My point didn't concern that point. Haskell compiler cannot change an
> algorithm using lists into something which deals with indexable arrays,
> usually faster. Indexing may be faster than the indirection, and the
> allocation of memory costs. And there is laziness...
This may be true, but it isn't relevant in this case, since the "obvious
c program" doesn't need any arrays, only two loops:
for (int i = 1; i <= 10000; i++) {
int sum = 0;
for (int j = 1; j < i; j++)
if (i % j == 0)
sum += i;
if (sum == i)
print(i);
}
Loops can be expressed with lazy lists in Haskell. Therefore, the
presented Haskell program is perfectly equivalent to the "obvious c
program".
Tillmann Rendel
More information about the Haskell-Cafe
mailing list