iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >如何在JavaScript, Scala和ABAP里实现尾递
  • 821
分享到

如何在JavaScript, Scala和ABAP里实现尾递

2024-04-02 19:04:59 821人浏览 泡泡鱼
摘要

在javascript, Scala和ABAP里实现尾递归(Tail Recursion),针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。B

javascript, Scala和ABAP里实现尾递归(Tail Recursion),针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Before we start to research tail recursion, let’s first have a look at the nORMal recursion.

A simple factorial implementation by recursion:

function factorial(n){
  if(n ===1) {
     return 1;
  }
  return n *factorial(n -1);}

Let N = 5, see how new stack frame is created for each time of recursive call:

如何在JavaScript, Scala和ABAP里实现尾递

We have two stack frames now, one stores the context when n = 5, and the topmost one for current calculation: n = 4

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

Now since n equals to 1, we stop recursion. The current stack frame ( n = 1 ) will be poped up, the frame under it will be activated and become the topmost frame, with calculated result 1 passed into.

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

key note for normal recursion: during recursion, every generated stack frame is needed and could not e destroyed until the final result is calculated. The calculation is actually not started until the recursion reaches the end ( the condition n === 1 fulfills ). If N is a big integer, it will lead to huge number of stack frames and finally the “stack overflow” or “out of memory” is inevitable.

tail recursion

Source code below:

function tailFactorial(n, total) {if(n ===1)
    return total;return tailFactorial(n -1, n * total);}function factorial2(n) {
  return tailFactorial(n,1);}

There are two biggest differences compared with normal recursion:

(1) A new internal function tailFactorial is introduced here.

(2) The calculation is actually now spread within every recursive stack frame. Each frame finishes one part of calculation and pass the current result to the next frame. Once the current stack frame finishes its task, it is actually not needed any more. And thus for example the model browser can then do some optimization on those useless stack frames.

Observe the stack frame for tail recursion step by step:

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

如何在JavaScript, Scala和ABAP里实现尾递

stack popped up:

如何在JavaScript, Scala和ABAP里实现尾递

When N = 20, the tail recursion has a far better performance than the normal recursion:

如何在JavaScript, Scala和ABAP里实现尾递

Update 2016-01-11

Tail recursion implementation via Scala:

如何在JavaScript, Scala和ABAP里实现尾递

The interesting thing is, after the Scala code is compiled into Java Byte code, compiler will eliminate the recursion automatically:

如何在JavaScript, Scala和ABAP里实现尾递

Tail Recursion in ABAP

First this is the normal recursion:

REPORT zrecursion.
START-OF-SELECTION.
  DATA: lv_result TYPE int4.
  PERFORM fac USING 6 CHANGING lv_result.
  WRITE: / lv_result.
FORM fac USING iv_n TYPE int4 CHANGING cv_result TYPE int4.
  DATA: lv_n TYPE i.
  cv_result = lv_n = iv_n.
  lv_n = lv_n - 1.
  IF lv_n > 1.
    PERFORM fac USING lv_n CHANGING cv_result.
  ENDIF.
  IF lv_n = 1.
    cv_result = cv_result * lv_n.
  ELSE.
    cv_result = cv_result * iv_n.
  ENDIF.
ENDFORM.

And here comes tail recursion version:

REPORT ztail.
START-OF-SELECTION.
  DATA: lv_result TYPE int4.
  PERFORM fac USING 5 1 CHANGING lv_result.
  WRITE: / lv_result.
FORM fac USING iv_n TYPE int4 iv_acc TYPE int4 CHANGING cv_result TYPE int4.
  DATA: lv_n          TYPE i,
        lv_accumulate TYPE i.
  IF iv_n < 1.
    cv_result = 1.
  ELSEIF iv_n = 1.
    cv_result = iv_acc * iv_n.
  ELSEIF iv_n > 1.
    lv_n = iv_n - 1.
    lv_accumulate = iv_acc * iv_n.
    PERFORM fac USING lv_n lv_accumulate CHANGING cv_result.
  ENDIF.
ENDFORM.

关于在JavaScript, Scala和ABAP里实现尾递归(Tail Recursion)问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网node.js频道了解更多相关知识。

--结束END--

本文标题: 如何在JavaScript, Scala和ABAP里实现尾递

本文链接: https://www.lsjlt.com/news/82455.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在JavaScript, Scala和ABAP里实现尾递
    在JavaScript, Scala和ABAP里实现尾递归(Tail Recursion),针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。B...
    99+
    2024-04-02
  • 详解Python如何实现尾递归优化
    目录一般递归与尾递归一般递归尾递归C中尾递归的优化Python开启尾递归优化一般递归与尾递归 一般递归 def normal_recursion(n): if n == 1:...
    99+
    2024-04-02
  • JavaScript如何实现递归
    这篇文章主要介绍JavaScript如何实现递归,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是递归?如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是...
    99+
    2023-06-21
  • JavaScript如何实现尾字母大写
    这篇文章主要介绍“JavaScript如何实现尾字母大写”,在日常操作中,相信很多人在JavaScript如何实现尾字母大写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2024-04-02
  • C++ 递归函数的尾递归优化策略如何实现?
    尾递归优化策略通过将尾递归调用转换为循环,有效减少函数调用栈深度,防止栈溢出。优化策略包括:检测尾递归:检查函数中是否存在尾递归调用。将函数转换为循环:使用循环来代替尾递归调用,并维护栈...
    99+
    2024-04-17
    递归函数 尾递归优化 c++
  • 如何只用位操作在ABAP里实现a+b
    本篇文章为大家展示了如何只用位操作在ABAP里实现a+b,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现代码:REPORT zint.PARAMETERS: a TY...
    99+
    2023-06-04
  • 如何实现JavaScript的共享传递和按值传递
    这期内容当中小编将会给大家带来有关如何实现JavaScript的共享传递和按值传递,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。关于JavaScript如何将值传递给函数...
    99+
    2024-04-02
  • JavaScript如何实现鼠标拖尾特效
    这篇文章主要介绍了JavaScript如何实现鼠标拖尾特效,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。看完这个保证你有手就行,制作各种好看的小尾巴!全部代码如下,看注释可以...
    99+
    2023-06-22
  • 如何在Java和JavaScript中实现重定向的数据传递?
    重定向是一种常用的Web开发技术,它可以将用户请求重定向到另一个URL,并且可以在重定向过程中传递数据。在Java和JavaScript中实现重定向的数据传递有许多不同的方法,本文将为大家介绍其中的一些方法。 一、Java中实现重定向的数据...
    99+
    2023-06-26
    重定向 javascript 教程
  • C++ 函数的递归实现:如何使用尾递归优化技术?
    递归函数的效率问题可以通过尾递归优化 (tc++o) 技术解决。c++ 编译器虽然不支持 tco,但可以通过 [__tail_recursive](https://en.cpprefer...
    99+
    2024-04-22
    c++ 递归
  • 在ABAP里如何模拟实现Java Spring的依赖注入
    这篇文章将为大家详细讲解有关在ABAP里如何模拟实现Java Spring的依赖注入,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。尝试的场景在现实生活中,每一盏灯都有一个开关控制。按下开关,灯被打开;再按...
    99+
    2023-06-02
  • python如何实现递归求和
    这篇文章主要介绍python如何实现递归求和,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!递归求和python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型...
    99+
    2024-04-02
  • 如何在PHP和JavaScript之间实现实时同步?
    在现代的Web开发中,PHP和JavaScript是两种不可或缺的编程语言。PHP通常用于服务器端编程,而JavaScript则用于客户端编程。在某些情况下,我们需要在PHP和JavaScript之间实现实时同步,以便使网站的用户界面更加友...
    99+
    2023-08-13
    同步 实时 javascript
  • 如何在GO和JavaScript中实现重定向和并发?
    重定向和并发是现代Web开发中非常重要的两个概念。重定向可以使用户从一个页面自动跳转到另一个页面,而并发可以使您的应用程序同时处理多个请求。在本文中,我们将探讨如何在GO和JavaScript中实现这两个概念。 重定向 重定向是一种将用户...
    99+
    2023-07-19
    javascript 重定向 并发
  • PHP和JavaScript如何在Linux系统下实现实时性?
    在实时性方面,PHP和JavaScript是两种非常常见的编程语言。PHP是一种服务器端脚本语言,用于构建Web应用程序,而JavaScript则主要用于前端开发,用于实现用户界面交互和动态效果。虽然它们的应用场景不同,但在某些情况下,我...
    99+
    2023-10-04
    javascript 实时 linux
  • JavaScript如何实现乘和加
    本篇内容主要讲解“JavaScript如何实现乘和加”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript如何实现乘和加”吧! ...
    99+
    2024-04-02
  • 如何在javascript中实现异步
    本篇文章给大家分享的是有关如何在javascript中实现异步,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方法:1、利用setTimeout;2、利用setImmediate...
    99+
    2023-06-15
  • 如何在 Windows 上使用 Python 和 JavaScript 实现同步?
    随着Python和JavaScript的广泛应用,越来越多的开发者希望在Windows系统上使用这两种语言实现同步。Python和JavaScript都是一种高级编程语言,它们都具有优秀的性能和易于学习的特点。本文将介绍如何在Windows...
    99+
    2023-09-09
    javascript windows 同步
  • 如何在PHP和Django中实现对JavaScript的响应?
    在现代的Web应用程序中,JavaScript变得越来越重要。它可以为用户提供流畅的用户体验,同时可以向服务器发送异步请求。因此,与JavaScript的交互变得越来越必要。在本文中,我们将讨论如何在PHP和Django中实现对JavaSc...
    99+
    2023-10-05
    django 响应 javascript
  • 重定向技术:如何在Go和JavaScript中实现?
    在Web开发中,重定向技术是一个非常常见的概念。它可以用来将用户从一个URL地址重定向到另一个URL地址。在这篇文章中,我们将介绍如何在Go和JavaScript中实现重定向技术。 Go中的重定向 在Go中,我们可以使用"net/http...
    99+
    2023-10-21
    javascript 重定向 ide
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作