Why is Haskell so slow compared to C for Fibonacci sequence?
我只是哈斯克尔的初学者。我写了一个代码来显示斐波那契序列中的n个数字。这是我在哈斯克尔的密码,
1 2 3 | fib_seq 1 = 1:[] fib_seq 2 = 1:1:[] fib_seq n = sum(take 2 (fib_seq (n-1))):fib_seq (n-1) |
当我在ghci中对更高的数字(如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include<stdio.h> int fib_seq (int n){ if(n==1) return 1; else if(n==2) return 1; else return fib_seq(n-1)+fib_seq(n-2); } void print_fib(int n){ if(n==0) return; else printf("%i", fib_seq(n)); print_fib(n-1); } int main(int argn, char* argc){ print_fib(40); return 0; } |
号
代码很快。使用gcc编译时大约需要1秒钟的时间。哈斯克尔应该比C慢吗?我在网上找到了其他答案,他们说了一些关于记忆化的问题。我开始学哈斯克尔,我不知道这是什么意思。我要说的是,我编写的C代码和haskell代码都执行相同的步骤,haskell比C慢得多,它挂起了我的ghci。一个1-2秒的差异是我永远不会担心的,如果C也采取了同样的时间作为哈斯克尔,我也不会担心。但哈斯克尔撞车和C在1秒钟内做是不可接受的。
下面的程序是用
1 2 3 4 5 6 | fib_seq :: Int -> Int fib_seq 1 = 1 fib_seq 2 = 1 fib_seq n = fib_seq (n-1) + fib_seq (n-2) main = mapM_ (print . fib_seq) [40,39..1] |
一些评论:
当然,使用许多著名的更好的斐波那契算法中的一种,将会胜过所有这些胡说八道。
猜猜如果"fib_seq(n-1)"在每个递归上被评估两次会发生什么。然后试试这个:
1 2 3 4 | fib_seq 1 = 1:[] fib_seq 2 = 1:1:[] fib_seq n = sum(take 2 f):f where f = fib_seq (n-1) |
号