`
javatoyou
  • 浏览: 1083519 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

什么是尾递归

 
阅读更多
今天在"Javascript语言精髓与编程实践"中看到,周爱民大牛提到"尾递归这个名词",在百度知道里面查到相关资料

尾递归 - Tail Recursion

一种算法, 用于计算机编程技术.

尾递归是针对传统的递归算法而言的, 传统的递归算法在很多时候被视为洪水猛兽. 它的名声狼籍, 好像永远和低效联系在一起.

尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量. 直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去.

以下是具体实例:

线性递归:
long Rescuvie(long n) {
return(n == 1) ? 1 : n * Rescuvie(n - 1);
}

尾递归:
long TailRescuvie(long n, long a) {
return(n == 1) ? a : TailRescuvie(n - 1, a * n);
}

long TailRescuvie(long n) {//封装用的
return(n == 0) ? 1 : TailRescuvie(n, 1);
}

当n = 5时
对于线性递归, 他的递归过程如下:
Rescuvie(5)
{5 * Rescuvie(4)}
{5 * {4 * Rescuvie(3)}}
{5 * {4 * {3 * Rescuvie(2)}}}
{5 * {4 * {3 * {2 * Rescuvie(1)}}}}
{5 * {4 * {3 * {2 * 1}}}}
{5 * {4 * {3 * 2}}}
{5 * {4 * 6}}
{5 * 24}
120

对于尾递归, 他的递归过程如下:
TailRescuvie(5)
TailRescuvie(5, 1)
TailRescuvie(4, 5)
TailRescuvie(3, 20)
TailRescuvie(2, 60)
TailRescuvie(1, 120)
120

很容易看出, 普通的线性递归比尾递归更加消耗资源, 在实现上说, 每次重复的过程
调用都使得调用链条不断加长. 系统不得不使用栈进行数据保存和恢复.而尾递归就
不存在这样的问题, 因为他的状态完全由n和a保存.
分享到:
评论

相关推荐

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

    首先,让我们了解什么是尾递归。尾递归是指在一个函数的最后一步调用自身,并且返回的结果是这个递归调用的结果,不进行任何额外的操作。这种情况下,编译器或解释器可以消除递归调用的额外栈帧,从而避免栈溢出的...

    C#中的尾递归与Continuation详解

    这几天恰好和朋友谈起了递归,忽然发现不少朋友对于“尾递归”的概念比较模糊,网上搜索一番也没有发现讲解地完整详细的资料,于是写了这么一篇文章,权当一次互联网资料的补充。:P 递归与尾递归 关于递归操作,相信...

    Java8使用lambda实现Java的尾递归

    Java8 使用 lambda 实现 Java 的尾递归 ...我们了解了什么是尾递归,如何使用 lambda 表达式来实现尾递归的优化,并且了解了如何使用 lambda 实现阶乘计算。希望这篇文章能够帮助您更好地理解 Java8 中的尾递归。

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

    但Python标准解释器并未对尾递归进行优化,所以尾递归在Python中的效果并不明显。 3. **循环**: 循环是最有效的方法,如 `Fib_circle` 函数所示。通过循环,我们可以避免递归带来的额外开销,只需线性时间复杂度...

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

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

    尾递归.cpp

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

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

    首先,让我们理解什么是尾递归。在函数中,如果递归调用是最后一个执行的操作,并且没有其他计算跟随,那么这个递归调用就是尾递归。例如,以下是一个简单的阶乘函数,是非尾递归的: ```javascript function ...

    关于尾递归的使用详解

    **尾递归详解** 尾递归(Tail Recursion)是一种特殊的递归形式,它是递归概念的一个子集,主要用于优化递归算法。普通递归在执行过程中会不断积累调用栈,随着递归深度的增加,内存消耗也会急剧增大,可能导致栈...

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

    首先,让我们明确什么是尾递归。尾递归是指在函数的末尾进行递归调用,并且该递归调用是函数体中最后执行的操作,不涉及任何其他计算。换句话说,递归调用的结果直接作为函数的返回值,没有其他操作。这种特性使得...

    Python库 | tail_recursion-1.1.1-py3-none-any.whl

    首先,让我们理解什么是尾递归(Tail Recursion)。尾递归是一种优化的递归方式,它在函数返回的时候,调用自身本身,并且return语句不能包含表达式。这种技术可以使递归调用在编译器或解释器的支持下被优化,避免栈...

    尾递归详细总结分析

    尾递归是编程语言中的一种优化技术,特别适用于递归函数。它涉及到函数在递归调用自身时,其最后一步操作就是调用自身,并且没有其他任何操作。这种调用方式允许编译器或者解释器优化递归,避免在调用栈中积累大量...

    关于尾递归和Cooper变换

    ### 关于尾递归 尾递归是一种特殊的递归形式,在这种形式中,递归调用是函数中的最后一个操作。也就是说,递归调用之后没有其他待执行的操作。这种递归形式的重要之处在于它可以被优化为迭代过程,从而避免了传统...

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

    JavaScript中的尾递归是一种特殊的递归形式,它在递归调用出现在函数体末尾时出现,且没有其他操作紧跟其后。这种形式的递归理论上可以被优化,因为其不会增加额外的堆栈帧,使得无限递归变为可能而不会导致堆栈溢出...

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

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

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

    下面我们直接切入正题,开始介绍尾递归。 尾递归 普通递归和尾递归如果仅仅只是从代码的角度出发来看,我们可能发现不了他的特点,所以笔者利用两张堆栈上的图来展示具体的差距在哪,首先我们来看看普通的递归调用的...

Global site tag (gtag.js) - Google Analytics