Haskell程序崩溃 - 无限递归?错误的地方声明?

时间:2013-09-10 13:35:02

标签: haskell recursion where

我需要计算1..n中所有因子的乘积。 当我将此函数称为double_factorial(至少有2或3作为args)时, 它似乎被召唤了一会儿,但没有任何反应,几秒钟后GHCi就会关闭。怎么了?是否有一些我无法看到的无限递归? 这是我的代码:

double_factorial :: Integer->Integer
double_factorial n 
    | n<0 = error "negative number is given"
    | n==0 = 1
    | otherwise = (factorial n)*(double_factorial n-1)
    where
    factorial :: Integer->Integer
    factorial n 
        | n == 0  = 1
        | otherwise = n*(factorial n-1)

3 个答案:

答案 0 :(得分:11)

(double_factorial n-1)表示((double_factorial n) - 1)所以是的,这是一个无限递归问题。

答案 1 :(得分:6)

首先,因为你直接打开GHCi,GHCi停止运行后,它运行的终端窗口就会关闭。如果你打开cmd(或类似的终端),然后从那里使用GHCi,你可以看到GHCi停止运行时抛出的错误。在这种情况下,我们得到:

<interactive>: out of memory

这确实表明了无限递归问题,正如您已经怀疑的那样。

因为factorial是更简单的函数,所以更容易检查它的递归调用是否是罪魁祸首。它是,factorial n - 1表示(factorial n) - 1而不是factorial (n - 1)。在factorial n的定义中调用factorial n几乎就是无限递归的教科书案例。在double_factorial中,我们看到了同样的问题。

答案 2 :(得分:5)

您遇到递归问题:f x - 1f (x - 1)不同。解决方案(删除不需要的括号并添加所需的括号):

double_factorial :: Integer->Integer
double_factorial n 
    | n<0 = error "negative number is given"
    | n==0 = 1
    | otherwise = factorial n * double_factorial (n-1)
    where
    factorial :: Integer->Integer
    factorial n 
        | n == 0  = 1
        | otherwise = n * factorial (n-1)