我一直在尝试探索Haskell中递归的可能性,但在面对大递归时如何提高效率我不太了解。今天,我想做一个计算第二类斯特林数的函数:
factorial :: Integer -> Integer
factorial n = helper n 1
where
helper 1 a = a
helper n a = helper (n-1) (a*n)
stirling :: Integer -> Integer -> Integer
stirling n 1 = 1
stirling n 2 = ((2 ^n)- 2) `div` 2
stirling n k
| k > n = 0
| k == n = 1
| k == (n-1) = (factorial n) `div` (factorial 2 * (factorial(n-2)))
| otherwise = stirling (n-1) (k-1) + k *(stirling (n-1) k)
我一直在尝试创建一个辅助函数,就像阶乘定义中一样,可以避免 Haskell 的惰性求值占用过多内存资源带来的不便。我想做同样的事情,在每次调用中计算乘积
k *(stirling (n-1) k)
递归,但我没有掌握它的窍门。有任何想法吗?
PD:代码已经运行得相当不错,但我是 Haskell 的新手,我仍然不知道可能性是什么。欢迎任何改进(尽管我认为不使用任何库;我想在进入之前学习基础知识)。