为什么Haskell中的阶乘计算比Java中的阶乘计算快得多。
我遇到的编程问题之一涉及计算大数的阶乘(数字高达10 ^ 5)。我见过一个简单的Haskell代码,它是这样的
factorial :: (Eq x, Num x) => x -> x
factorial 0 = 1
factorial a = a * factorial (a - 1)
它隐式处理巨大的数字,并且即使没有代码中涉及的任何缓存,也会以某种方式运行得更快。
当我尝试使用Java解决问题时,我不得不使用BigInteger来保存巨大的数字,并且还使用阶乘的迭代版本。
public static BigInteger factorialIterative(int n)
{
if(n == 0 || n == 1) return BigInteger.valueOf(1);
BigInteger f = BigInteger.valueOf(1);
for(int i = 1 ; i <= n ;i++)
f = f.multiply(BigInteger.valueOf(i));
return f;
}
上述代码超出了程序设置的执行时间限制。我还尝试了阶乘的缓存递归版本
public static BigInteger factorial(int n)
{
if(cache[n] != null)
return cache[n];
else if(n == 0)
return new BigInteger("1");
else {
cache[n] = n* factorial(n - 1);
return cache[n];
}
}
这给了我一个内存不足的错误(可能是由于递归)。
我的问题是,为什么像Haskell这样的函数式编程语言在处理这些涉及大量数字的问题方面做得更好?(尽管没有明显的缓存)。有没有办法让java代码像Haskell代码一样快地运行?