我需要计算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)
答案 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 - 1
与f (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)