4

我需要从 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)
4

3 回答 3

11

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

于 2013-09-10T13:36:55.327 回答
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我们看到同样的问题。

于 2013-09-10T13:51:01.750 回答
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)
于 2013-09-10T13:39:07.140 回答