我建议使用OML或Haskell等ML风格的功能语言。我发现模式匹配语法确实帮助我理解了甚至相对复杂的递归函数,当然比Scheme if
和cond
语句要好得多。(我同时学习了Haskell和Scheme。)
这是一个简单的对比示例:
(define (fib n)
(cond [(= n 0) 0]
[(= n 1) 1]
[else (+ (fib (- n 1)) (fib (- n 2)))]))
以及模式匹配:
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
这个示例并没有真正实现差异正义-我从未在函数的任何版本上遇到问题。只是为了说明这两个选项的样子。一旦使用了列表和树之类的功能获得了更为复杂的功能,两者之间的区别就会变得更加明显。
我特别推荐Haskell,因为它是一种简单的语言,语法非常好。使用诸如corecursion之类的更高级的想法,它也变得容易得多:
fibs = 0 : 1 : zipWith (+) fibs (drop 1 fibs)
fib n = fibs !! n
(在与Haskell一起玩之前,您不会理解上面的代码,但是请放心,它基本上是神奇的:P。)当然,您可以对Scheme中的流执行相同的操作,但是在Haskell中它自然得多。