版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013591740/article/details/53264161
尾递归是对递归的性能优化
先来一道题目:
请写一段代码来计算给定文本内字符“A”的个数,用递归求解
public class RecursiveCall {
public int countA(String input) {
// 如果是null或长度为零则返回零
if (input == null || input.length( ) == 0) {
return 0;
}
int count = 0;
//检查第一个字符是否为‘A’
if (input.substring(0, 1).equals("A")) {
count = 1;
}
//这里递归循环
return count + countA(input.substring(1));
}
public static void main(String[ ] args) {
System.out.println(new RecursiveCall( ).countA("AAA rating"));
}
}
上面是常规的递归方法,假设count大于1,返回结果是count + countA(input.substring(1)),每次递归其入口都会记录在栈中,而每次调用结束后,原先生成的信息(如count)就没用了,且还在栈中。这些无用信息可以丢弃,然后用一组新的参数来调用一次递归产生新的结果。
尾递归代码如下:
public class TailRecursiveCall {
public int countA(String input) {
// 如果是null或长度为零则返回零
if (input == null || input.length() == 0) {
return 0;
}
return countA(input, 0) ;
}
public int countA(String input, int count) {
if (input.length() == 0) {
return count;
}
// 检查第一个字符是否为‘A’
if (input.substring(0, 1).equals("A")) {
count = count + 1;
}
// 递归
return countA(input.substring(1), count);
}
public static void main(String[] args) {
System.out.println(new TailRecursiveCall().countA("AAA rating"));
}
}