使函数成为尾递归

使函数成为尾递归

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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值