用fix写递归函数

April 29, 2013

不会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'