不会Y Combinator都不好意思说自己学过函数式编程啊,但是这不妨碍你用fix
写递归函数。
首先从简单的递归fib
开始:
fib n
| n < 2 = 1
| otherwise = fib (n - 1) + fib (n - 2)
fib
的定义是递归的,我们把递归调用的fib
用一个参数f
表示:
fib' f n
| n < 2 = 1
| otherwise = f (n - 1) + f (n - 2)
这样fib'
就不是递归定义了。最后祭出fix
:
fib = fix fib'
搞定收工。
Ackermann函数也没问题:
ack' a 0 n = n + 1
ack' a m 0 = a (m - 1) 1
ack' a m n = a (m - 1) (a m (n - 1))
ack = fix ack'