tail recursion 尾递归

本文探讨了尾递归的概念及其在不同编程语言中的应用,以Scala为例展示了尾递归优化如何减少栈空间开销。通过示例解释了尾递归函数的特点,并提供了验证编译器是否进行尾递归优化的方法。
摘要由CSDN通过智能技术生成

尾递归并不是函数式编程才有的特性,c++ 里面也是有的。第一次接触尾递归,是在 UW的coursera课程中,第二次是在sensetime的面试中,面试官问我了解尾递归吗,什么情况下编译器可以用尾递归优化。这里虽然使用 scala作为实例讲解尾递归,但请注意,这并不是函数式语言中才有的特性

先说定义,尾递归就是一种特殊的递归,这种递归编译器可以优化,怎么优化呢?如果递归的过程中可以用被调用函数的栈将调用者函数的栈完全覆盖掉(而和不覆盖掉的运行效果是一样的),那么编译器就可以用尾递归优化,

在这里插入图片描述

这是 课程中的一个定义

example1

def gcd(a:Int,b:Int):Int={
    if(b==0)a
    else gcd(b,a%b)
}

这里函数 gcd 有一个递归调用,可是其实可以完全用递归函数的栈覆盖掉原来的函数,而不产生任何问题
在这里插入图片描述

它的函数调用栈大概长成这样, 非尾递归, 尾递归

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值