Tail Recursion 尾递归
来源:互联网 发布:mac搜狗五笔无法使用 编辑:程序博客网 时间:2024/05/21 17:28
昨天做LeetCode的时候发现一个词,Tail Recursion。今天来简单介绍。
Q:sum(5) = 1 + 2 + 3 + 4 + 5 = 15; 为了简单我们用Python
1、普通递归:
def recsum(x): if x == 1: return x else: return x + recsum(x - 1)
python解释器会做如下动作。
"""recsum(5)5 + recsum(4)5 + (4 + recsum(3))5 + (4 + (3 + recsum(2)))5 + (4 + (3 + (2 + recsum(1))))5 + (4 + (3 + (2 + 1)))15"""
2、尾递归
def tailrecsum(x, running_total=0): if x == 0: return running_total else: return tailrecsum(x - 1, running_total + x)
递归过程:
"""tailrecsum(5, 0)tailrecsum(4, 5)tailrecsum(3, 9)tailrecsum(2, 12)tailrecsum(1, 14)tailrecsum(0, 15)15"""
3、小结
【1】在尾递归中,其实只有前进的过程,也就是顺藤摸瓜(瓜就是返回结果)。摸到瓜结束。
【2】在普通递归中,我们摸到了瓜(这个瓜在这里指的是递归的base case),你还得记住你怎了顺的藤(将中间过程压栈),然后在把瓜顺着藤捣腾回去(栈的回退),直到到了最初的起点(栈空)。然后返回。
4、比较
@为什么尾递归他比递归少了那么多步骤,还不用建立栈呢?
其实,他开始的时候有一个变量,我们每次迭代都会Update这个变量。这就省去了入栈出栈的过程。节省了很多空间和时间啊。
@那二者还有其他的差别吗?
有的,其实,这道题是sum(5),那我下次sum(10000000),会怎么样呢?
递归: the stack will overflow
尾递归:不会 stack overflow相对于尾递归,普通递归不是省油的灯啊
我理解,尾递归的效率(包括时间空间) == 循环
0 0
- 尾递归 - Tail Recursion
- 尾递归 tail recursion
- Tail Recursion 尾递归
- 尾递归(Tail recursion / Tail call)
- 递归与尾递归(Tail Recursion)
- 尾递归(tail recursion) 的简单使用
- 阶乘的尾递归(Tail Recursion)写法(C++)
- tail recursion
- Tail recursion and normal recursion
- 递归 recursion
- Recursion--递归
- 尾递归(tail-recursive)
- Scala Learning(3): Tail Recursion定义
- 八、递归 ( recursion)
- 递归算法Recursion
- Recursion 递归算法
- 递归算法Recursion algorithm
- 递归算法 recursion
- offload 优化技术-浅谈
- 通过Oracle Golden Gate 进行Oracle到SQL Server的同步
- eclipse or intellij idea 清除svn标示
- 字节序相关问题
- 常用组件
- Tail Recursion 尾递归
- 垃圾回收算法之分代回收算法
- 行列式(determinant)的物理意义及性质
- iOS应用内支付(内购)
- "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
- STM8S单片机串口调试
- golang--自动下载邮件的附件
- python中for用来遍历range函数
- 自动获取sim号码填入edittext