Aya*_*ana -1 c performance haskell fibonacci
我只是Haskell的初学者.我编写了一个代码来显示Fibonacci序列中的N个数字.这是我在Haskell中的代码,
fib_seq 1 = 1:[]
fib_seq 2 = 1:1:[]
fib_seq n = sum(take 2 (fib_seq (n-1))):fib_seq (n-1)
Run Code Online (Sandbox Code Playgroud)
当我fib_seq 40在GHCI中运行此代码以获得更高的数字时,需要花费很长时间来评估它并且我的计算机挂起并且我必须中断.但是,当我在C中写出相同的逻辑时,(我只是打印而不是将其保存在列表中),
#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; }
Run Code Online (Sandbox Code Playgroud)
代码非常快.使用GCC编译时运行大约需要1秒.Haskell应该比C慢吗?我在互联网上查找了其他答案,他们说了一些关于memoization的内容.我开始Haskell,我不知道这意味着什么.我所说的是我编写的C代码和Haskell代码都执行相同的步骤,而Haskell比C慢得多,它挂起了我的GHCI.1-2秒的差异是我永远不会担心的,如果C也花了与Haskell相同的时间,我也不会担心.但Haskell崩溃和C在1秒内完成它是不可接受的.
Dan*_*ner 17
以下编译的程序ghc -O2 test.hs是您发布的C代码的速度的+/- 2%gcc -O2 test.c.
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]
Run Code Online (Sandbox Code Playgroud)
一些评论:
Integer而不是Int用于largenum算术,并且具有类多态类型而不是单态类型,在每个函数调用上增加开销.当然,使用众所周知的更好的斐波那契算法之一将胜过所有这些无稽之谈.
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |