`
gashero
  • 浏览: 943976 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

骗人的尾递归

阅读更多

现代的主要编程语言,大部分都用各种各样的方式引入了函数式编程的模式。不过其主要模式仍然为过程式,或者是面向对象的。这其中在引入函数式编程的概念方面产生了一些恶心的事情。一些其语言本身已经解决了的问题,却尝试引入函数式编程来解决,导致很多麻烦。这其中不可不提的一个问题就是尾递归- tail recursive。

 

尾递归的主要用途是在函数式编程语言中实现循环。因为一般的函数式编程语言没有提供所谓的for循环。所以其循环就是每次应用一个元素,然后继续递归调用自己,传入列表中下一个元素。这个时候,如果函数本身受到调用栈的限制,那么循环次数就会受到很大的限制。所以尾递归的出现就是为了解决此类问题的。让每次递归调用都不会增加调用栈的层次。使得尾递归实现的循环可以有无限的深度。

 

但是问题就在一些已经有其他方式实现尾递归的语言也在玩这个东西。典型的就是Lua。其用了一堆篇幅不停的讲尾递归,却没有在书中讲这玩意有什么用。其主要原因就是Lua中有完善的循环,没必要非得使用尾递归来实现循环。

 

好吧,函数式编程博大精深,现有的编程语言用脸去贴屁股的行为我可以理解,但是不要照猫画虎的制造复杂度就是了。也许对我来说,找空去写个《函数式编程语言Python入门指南》会好些。函数式编程真的很美。

2
1
分享到:
评论
4 楼 linkerlin 2012-01-20  
说道尾递归,我就想到JVM没法搞,然后就是clojure悲催的recur。。。
神啊,赐予每个虚拟机尾递归功能吧~
3 楼 lych 2011-05-31  
至少有一个好处就是让那些平庸程序员们难以读懂你的代码从而无法取代你的位置,何乐而不为……
2 楼 fujohnwang 2011-05-31  
hehe , FP的idea好像比你说的那些Languages要早
1 楼 whitesock 2011-05-30  
tail recursion本质在于能重用stack frame,没什么骗人不骗人的。

相关推荐

    尾递归.cpp

    /*int f(int n,int a1,int a2) { if(n) return a1; else return f(n - 1, a2, a1 + a2); }*/

    关于尾递归的使用详解

    这几天看到几篇关于尾递归的文章,之前对尾递归没有多大概念,所以回头研究了一下尾递归。  尾递归的概念尾递归(Tail Recursion)的概念是递归概念的一个子集。对于普通的递归,由于必须要记住递归的调用堆栈,...

    JS尾递归的实现方法及代码优化技巧

    本文实例讲述了JS尾递归的实现方法及代码优化技巧。分享给大家供大家参考,具体如下: 在学习数据结构和算法的时候,我们都知道所有的递归都是可以优化成栈+循环的。 对于特定的递归函数,一般我们都是手动对它们...

    es6函数之尾递归用法实例分析

    本文实例讲述了es6函数之尾递归用法。分享给大家供大家参考,具体如下: 函数调用自身,称为递归,如果尾调用自身,就称为尾递归。 递归非常耗费内存。因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误...

    Python中使用装饰器来优化尾递归的示例

    尾递归简介 尾递归是函数返回最后一个操作是递归调用,则该函数是尾递归。 递归是线性的比如factorial函数每一次调用都会创建一个新的栈(last-in-first-out)通过不断的压栈,来创建递归, 很容易导致栈的溢出。而尾...

    详解python使用递归、尾递归、循环三种方式实现斐波那契数列

    本篇文章主要介绍了python使用递归、尾递归、循环三种方式实现斐波那契数列,非常具有实用价值,需要的朋友可以参考下

    C.rar_instead5ss_尾递归_整数转为二进制数

    在C语言的环境下,运用尾递归将整数转换为二进制数 在C语言的环境下,运用尾递归将整数转换为二进制数

    尾递归详细总结分析

    尾递归与Continuation递归与尾递归关于递归操作,相信大家都已经不陌生。简单地说,一个函数直接或间接地调用自身,是为直接或间接递归。例如,我们可以使用递归来计算一个单向链表的长度: 代码如下:public class ...

    C#中的尾递归与Continuation详解

    主要介绍了C#中的尾递归与Continuation详解,本文讲解了递归与尾递归、尾递归与Continuation、Continuation的改进等内容,需要的朋友可以参考下

    C#函数式编程中的递归调用之尾递归详解

    普通递归和尾递归如果仅仅只是从代码的角度出发来看,我们可能发现不了他的特点,所以笔者利用两张堆栈上的图来展示具体的差距在哪,首先我们来看看普通的递归调用的情况,如下图1.1所示: 假设这里执行的函数是...

    Python递归及尾递归优化操作实例分析

    本文实例讲述了Python递归及尾递归优化操作。分享给大家供大家参考,具体如下: 1、递归介绍 递归简而言之就是自己调用自己。使用递归解决问题的核心就是分析出递归的模型,看这个问题能拆分出和自己类似的问题并且...

    关于尾递归和Cooper变换

    这是一个关于尾递归和Cooper变换的文档,有兴趣的人可以下载。

    Fibonacci数列的四种解法:递归、存储优化的递归、自下而上的递归(迭代法)、尾递归

    fibonacci数列的各种解法,递归、存储优化的递归、自下而上的递归(迭代法)、尾递归。其中分析内容请移步我的博客、

    Python尾递归优化实现代码及原理详解

    在尾递归中,先执行某部分的计算,然后开始调用递归,所以你可以得到当前的计算结果,而这个结果也将作为参数传入下一次递归。这也就是说函数调用出现在调用者函数的尾部,因为是尾部,所以其有一个优越于传统递归之...

    Python进阶之尾递归的用法实例

    如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在...

    Java8使用lambda实现Java的尾递归

    主要介绍了Java8使用lambda实现Java的尾递归的相关资料,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics