使函数成为尾递归
Preface
OK,最近开始玩函数式编程,为什么要学这个呢,因为我内心里不管怎么样还是有着一份知识分子的自傲,虽然现在在从事着业界所谓的代码编程工作。
首先是常规的递归调用,这个也是很常见的内容
static Integer sum(List<Integer> list){
return list.isEmpty()
?0
:head(list)+sum(tail(list));
}
根据书中所说,java并不会对尾递归进行优化的操作。所以其实单单从函数本身来看,转换成尾递归的形式仅仅是改变了函数的形式而已,那么为什么要这么操作呢?
与其浪费这个时间去做什么尾递归,还不如到公司里面去勾搭勾搭妹子,这样至少还有正向收益,至少能脱个单。
转换成尾递归的目的是为了服务于函数式编程,一旦递归调用转换成了尾递归,那么这就意味着函数的调用变成了链式调用,而并不是原来的复合嵌套调用。这意味着什么呢?这就意味可以通过函数式的方式,通过牺牲空间来存储函数调用的方式来很好的避免因为递归可能产生的方法栈溢出的错误,即所谓的StackOverFlow Exception。
static Integer sum(List<Integer> list){
return sum(tail,0);
}
static Integer sumTail(List<Integer> lit,int acc){
?acc
:sumTail(tail(list),acc+head(list));
}