Recursion and Tail Recursion in Java and Erlang
2019独角兽企业重金招聘Python工程师标准>>>
Typical Recursion Example (hanoi problem)
public void move(int n, String strFrom, String strTemp, String strTo) {if (n == 1) {show(1, strFrom, strTo);} else {move(n - 1, strFrom, strTo, strTemp);move(n - 1, strTemp, strFrom, strTo);}}
Then I come cross the term recursion and tail recursion in Erlang.
%% recursion
sum([H|T]) ->H + sum(T);
sum([]) ->0.
%% tail recurion
sum(X) ->sum(X, 0).
sum([H|T], Acc) ->sum(T, H + Acc);
sum([], Acc) ->Acc.
What is A Tail Call?
A tail call is a fancy term that refers to a situation in which a method or function call is the last instruction inside of another method or function.
Recursion Code with Java.
/*** sum from 1 to n. recursion* @param i* @return sum */public int recur_head(int i){if(i==1)return 1;elsereturn i+recur_head(i-1);}
Tail Recursion Code with Java.
/**** sum from 1 to n. tail recursion* @param i* @param total* @return*/public int recur_tail(int i, int total){if (i == 1)return 1+total;return recur_tail(i-1, total +i);}
See the class with
javap -c
public class Recur {public Recur();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic int recur_head(int);Code:0: iload_11: iconst_12: if_icmpne 75: iconst_16: ireturn7: iload_18: aload_09: iload_110: iconst_111: isub12: invokevirtual #2 // Method recur_head:(I)I15: iadd16: ireturnpublic int recur_tail(int, int);Code:0: iload_11: iconst_12: if_icmpne 95: iload_26: iconst_17: iadd8: ireturn9: aload_010: iload_111: iconst_112: isub13: iload_214: iload_115: iadd16: invokevirtual #3 // Method recur_tail:(II)I19: ireturn
}
for Java Developer
Java programmers tend to avoid recursion through the use of loops.
int factorial(int n) {int result = 1;for (int t=n; t > 1; t--)result *= t;return result;}
Reference
http://www.drdobbs.com/jvm/tail-call-optimization-and-java/240167044
转载于:https://my.oschina.net/u/1767744/blog/305910
Recursion and Tail Recursion in Java and Erlang相关推荐
- JavaScript, ABAP和Scala里的尾递归(Tail Recursion)
这是Jerry 2021年的第 12 篇文章,也是汪子熙公众号总共第 283 篇原创文章. 今天是2021年1月20日,看看历史上的今天都发生了什么. 2004年1月20日,第一个公开版本的Scala ...
- Tail Recursion尾递归
什么是尾递归 Tail Recursion /teɪl rɪˈkɜːrʒn/ In traditional recursion, the typical model is that you perfo ...
- php recursion,PHP与Recursion 学习笔记
在程序设计中,递归(Recursion)是一个很常见的概念,合理使用递归,可以提升代码的可读性,但同时也可能会带来一些问题. 下面以阶乘(Factorial)为例来说明一下递归的用法,实现语言是PHP ...
- 使用java进行erlang字符解析
与公司后端对接的时候erlang工程师经常丢过来这样一串字符串 {{1,7,[1,[2,3]]},3}" 或是这样一串 [{1,7,[1,[2,3]]},3]" 有点类似json又 ...
- Erlang转JAVA,将Erlang UTF-8编码的字符串转换为java.lang.String
Java节点接收以UTF-8编码的Erlang字符串.它的类类型是OtpErlangString.如果我只是执行.toString()或.stringValue(),则生成的java.lang.Str ...
- 如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规
10 Rules (steps) for replacing the recursive function with stack and while-loop 转自http://www.codepro ...
- java erlang_Java开发人员的Erlang
java erlang 您可能没有注意到,但是距离我上次发布博客已经过去了几个星期. 这是由于我的Soleus骨折了,而且我的腿是石膏模型. 不能动弹,我认为调查完全不同的东西是个好主意–要么看那一天 ...
- Java开发人员的Erlang
您可能没有注意到,但是距离我上次发布博客已经过去了几个星期. 原因是我的Soleus骨折了,而我的腿也石膏了. 不能动弹,我认为调查完全不同的东西是个好主意–要么看那天的电视,要么,尽管Kojak和M ...
- java中将字符串顺序反传转_如何在Java中将字符串序列化的Erlang术语反序列化为JInterface对象?...
我的接口系统提供了来自Erlang世界的结果,该结果发送了erlang术语的字符串表示形式,例如元组列表: [ {"key1" , ["AAA","B ...
最新文章
- python 提交form-data之坑
- AzureDirectory Library for Lucene.Net
- yolov5 代码版,去掉配置文件
- 经典Golang语法50问!
- getpeername函数与getsockname函数的介绍
- 监控工具—Prometheus—监控Redis
- ibatis(0)ibatis 与 mybatis 简述
- ROS系统玩转自主移动机器人(3)-- 开源机器人结构介绍
- 再也回不去的 GitHub。。。
- Linux内核部件分析 设备驱动模型之bus
- 微信小程序 this.data与this.setData
- 金鳞岂是池中物IT评论博客正式成立
- 【RocketMQ】发送事务消息
- 海康摄像头之FTP服务器搭建及使用
- 收敛交叉映射(convergent cross mapping,CCM)滥觞、2012年Science论文引言部分:Detecting Causality in Complex Ecosystems
- terminus 和 windows terminal_Windows命令行终端神器Cmder配置及美化指南
- 针对电动车组线路布置与检测的线缆测试仪方案
- 在安卓手机上搭建一台微型服务器
- Unity视频播放的脚本控制
- 家用计算机硬件升级方案,旧电脑如何升级提速,老电脑升级方案!