## Recursion and Tail Recursion in Java and Erlang 原

i
iamtwang

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
*/
if(i==1)
return 1;
else
}``````

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:
1: invokespecial #1                  // Method java/lang/Object."<init>":()V
4: return

Code:
1: iconst_1
2: if_icmpne     7
5: iconst_1
6: ireturn
10: iconst_1
11: isub
12: invokevirtual #2                  // Method recur_head:(I)I
16: ireturn

public int recur_tail(int, int);
Code:
1: iconst_1
2: if_icmpne     9
6: iconst_1
8: ireturn
11: iconst_1
12: isub
16: invokevirtual #3                  // Method recur_tail:(II)I
19: 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

i

### 评论(1)

Apache Tomcat 9.0.12 和 8.5.34 版本发布

Apache Tomcat 是 Java Servlet、JavaServer Pages、Java 表达式语言和 Java WebSocket 技术的开源实现，是一个免费的开放源代码的 Web 应用服务器。 Apache Tomcat 9.0.12 和 8.5.34 两个版...

2018/09/12
1K
0
Spring boot中关于多对多查询json无限递归问题

2018/07/20
0
0
"Becoming Functional" 阅读笔记+思维导图

2017/12/08
0
0
MYSQL 存储过程中 执行游标里的动态SQL 如何破？

battier
2015/12/24
1K
4
Apache Qpid Python 1.35.0 发布

Apache Qpid Python 1.35.0 发布了，Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案，实现了高级消息队列协议。提供了 Java、C++ 两种服务端版本以及 Java、C++...

2016/08/31
1K
0

Spring Boot 2 快速教程：WebFlux 集成 Mongodb（四）

40分钟前
2
0
\$_ENV

\$_ENV数组中的内容是在PHP解析器运行时，从PHP所在服务器中的环境变量, 导入到PHP的全局命名空间, 转变为PHP全局变量。 这些变量很多是由支持 PHP 运行的 Shell 提供的，并且不同的系统很可能...

vinci321
54分钟前
2
0
Guava RateLimiter + AOP注解实现单机限流、统计QPS

1、基于springboot项目pom.xml添加如下依赖： <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><d......

3
0
JAVA NIO Connection reset by peer 异常

Jeremy_pan

2
0

gugudu

3
0