骗人的尾递归
现代的主要编程语言,大部分都用各种各样的方式引入了函数式编程的模式。不过其主要模式仍然为过程式,或者是面向对象的。这其中在引入函数式编程的概念方面产生了一些恶心的事情。一些其语言本身已经解决了的问题,却尝试引入函数式编程来解决,导致很多麻烦。这其中不可不提的一个问题就是尾递归- tail recursive。
?
尾递归的主要用途是在函数式编程语言中实现循环。因为一般的函数式编程语言没有提供所谓的for循环。所以其循环就是每次应用一个元素,然后继续递归调用自己,传入列表中下一个元素。这个时候,如果函数本身受到调用栈的限制,那么循环次数就会受到很大的限制。所以尾递归的出现就是为了解决此类问题的。让每次递归调用都不会增加调用栈的层次。使得尾递归实现的循环可以有无限的深度。
?
但是问题就在一些已经有其他方式实现尾递归的语言也在玩这个东西。典型的就是Lua。其用了一堆篇幅不停的讲尾递归,却没有在书中讲这玩意有什么用。其主要原因就是Lua中有完善的循环,没必要非得使用尾递归来实现循环。
?
好吧,函数式编程博大精深,现有的编程语言用脸去贴屁股的行为我可以理解,但是不要照猫画虎的制造复杂度就是了。也许对我来说,找空去写个《函数式编程语言Python入门指南》会好些。函数式编程真的很美。