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

About Tail Recursion(关于尾递归)

 
阅读更多

为了锻炼英语水平,为以后出国工作提前准备,我就用英文写了,也没查字典,可能有语法错误,欢迎大家指正。。

When we have to recursion we always prefer to use loop rather than recursion. 

Because when the recursion goes deep the stack will always overflow. Its like a nightmare to us. Why stack always overflow? Look at the code below.

 

```erlang

normal(N) when N > 0 -> N + normal(N - 1);

normal(0) -> 0.

```

Every time before the recursion goes to the next level, the stack always have to save N and the ‘normal' function’s status. So if the recursion goes deeper it  will cost out the stack’s space.

 

But if we use tail recursion it will not happen again. Look at the code below.

 

```erlang

tail(N) -> tail(N, 0).

 

tail(N, Result) when N > 0 -> tail(N - 1, N + Result);

tail(0, Result) -> Result.

```

 

In tail recursion we don’t need to save any status in stack. Because all result is in the parameters of next recursion. So the stack can fix the size.

0
4
分享到:
评论

相关推荐

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

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

    前端大厂最新面试题-tail_recursion.docx

    前端大厂最新面试题-tail_recursion 本文主要讲述了递归和尾递归的概念、实现和应用场景。递归是一种函数调用自身的方法,可以将一个大型复杂的问题分解成一个与原问题相似的规模较小的问题来求解。递归需要有边界...

    关于尾递归的使用详解

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

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

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

    C#中的尾递归与Continuation详解

    在启用tailcall优化后,编译器会在生成IL代码时,将尾递归转换为循环,从而避免了额外的栈帧。不过需要注意的是,C#的尾递归优化仅适用于静态方法和实例方法,不适用于匿名方法、lambda表达式或方法组。Continuation...

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

    这个装饰器`tail_call_optimized`的工作原理是:如果发现当前函数是自己的“孙子”调用(即连续两次递归调用自身),则抛出异常并捕获,通过不断循环调用函数来模拟尾递归的行为。这样即使对于非常大的输入,也能...

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

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

    csharp-trampolining-tail-call:C#实现Trampolin到尾递归

    在编程语言中,尾递归和trampolining是两种优化技术,主要用于处理深度递归,从而避免调用栈溢出的问题。C#作为一种高级的面向对象编程语言,虽然默认不支持尾递归优化,但我们可以利用trampolining来模拟这种优化。...

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

    虽然Python标准解释器并未对尾递归进行优化,但在某些支持尾递归优化的环境中,如Jython或某些Python的替代实现,尾递归可以带来显著的性能提升。了解并掌握尾递归的用法对于编写更高效、更优雅的代码至关重要。

    python中尾递归用法实例详解_.docx

    ### Python中的尾递归用法详解 #### 一、引言 在计算机科学领域,递归是一种非常重要的编程思想和技术,被广泛应用于算法设计、数据结构处理等方面。然而,在实际应用中,递归可能导致大量的栈空间消耗,甚至引起栈...

    jvm-tail-recursion:Java字节码中的尾部递归调用的优化器库

    例子倒数至零一个简单的尾递归函数,倒数为零:前后static void count( int n) { if (n == 0 ) { return ; } count(n - 1 ); } static void count( int n) { while ( true ) { if (n == 0 ) { return ; } n = n - 1 ...

    计算递归函数调用次数

    为了避免这种情况,可以考虑使用尾递归(Tail Recursion)、记忆化(Memoization)或迭代(Iteration)等优化方法。 尾递归是指在递归调用的最后返回结果,这样编译器或解释器有可能优化掉多余的栈帧,减少内存消耗...

    python中尾递归用法实例详解

    2. **Tail Recursion Exception**:Python本身并不支持原生的尾递归优化。然而,可以通过一些技巧来模拟实现,例如使用异常来传递控制流。在提供的代码示例中,定义了一个`TailRecurseException`类,用于在检测到尾...

    disc11.pdf

    相比之下,尾递归版本的`factorial`通过引入一个辅助函数`fact-tail`实现了优化。在这个版本中,`fact-tail`函数接收两个参数:n(当前的阶乘基数)和result(累积的乘积)。每次递归调用`fact-tail`时,它都是函数...

    详解JavaScript调用栈、尾递归和手动优化

    尾递归是递归的一种特殊形式,其中函数在其返回语句中调用自身,并且是其最后的操作。这样,优化尾调用的条件得以满足,使得调用栈不会随着递归深度增加而无限增长。例如,使用尾递归重写斐波那契数列: ```...

    java实现tail功能

    在IT行业中,尤其是在系统管理和日志分析领域,`tail`命令是一个非常常用且实用的工具。它允许用户实时查看文件的末尾,特别是在监控日志文件变化时非常有用。Java作为一种广泛使用的编程语言,也可以实现类似`tail`...

    windows下使用tail命令-tail2win

    在Windows操作系统中,通常我们习惯于使用图形化界面来管理和查看文件,但对于习惯于Linux环境的用户来说,一些命令行工具如`tail`是必不可少的。`tail`命令在Linux中用于查看文件的尾部内容,它对于实时监控日志...

Global site tag (gtag.js) - Google Analytics