背景:

今天聊代码规范的问题的时候说了一下尾调用的问题。

一:概念:

什么是尾调用?

尾调用(Tail Call):某个函数的最后一步仅仅只是调用了一个函数(可以是自身,可以是另一个函数)。

注意 “仅仅” 两个字。

例子:

// 尾调用:
- (NSInteger)funcA:(NSInteger)num { /* Some codes... */ if (num == 0) {
return [self funcA:num];// 尾调用->自身
} if (num > 0) {
return [self funcB:num];// 尾调用->函数funcB
} return [self funcC:num];// 尾调用->函数funcC
}
// 不是尾调用1:
- (NSInteger)funcA:(NSInteger)num { NSInteger num = [self funcB:(num)]; return num;// 不是尾调用->最后一步是返回一个值,而不是调用一个函数
}
// 不是尾调用2:
- (NSInteger)funcA:(NSInteger)num { return [self funcB:(num)] + 1;// 不是尾调用->原因:最后一步不仅调用了函数还有 +1 操作
}

二:优化点(尾调用优化在Release模式下才会有,Debug模式下没有。)

例子:一直开辟新的栈空间(最后会栈溢出,最终导致崩溃。空间复杂度O(n),时间复杂度O(n)。)

例子:尾调用的优化可以重复利用栈空间(重用栈帧,不申请栈空间。
空间复杂度O(1),时间复杂度O(n)。)

三、总结

总结:
1. 尾调用:某个函数的最后一步仅仅调用了一个函数(可以是自身,可以是另一个函数)。
2. OC的尾调用优化的本质是:栈帧的复用
3. 尾调用优化实现原理:当函数A的最后一步仅仅是调用另一个函数B时(或者调用自身函数A),这时,因为函数A的位置信息和内部变量已经不会再用到了,直接把函数A的栈帧交给函数B使用。

四:附加思考:

 

思考:尾调用尾部加0可以达到尾调用优化,加.0就不能达到,是为什么呢?

注:

参考:https://www.jianshu.com/p/9e3cd9b1095a

最新文章

  1. laypage分页
  2. Android中怎么用this
  3. linux chromuim安装常用插件(flash,手势,拖拽,广告屏蔽)
  4. 禁用cookie后session是如何设置的
  5. Beaglebone Back学习三(开发环境搭建)
  6. hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明
  7. 评论一下现有几个开源IM框架(Msn/QQ/Fetion/Gtalk...)
  8. mysql函数count(*)和count(column)的区别(转)
  9. NOIP2012 借教室 Splay初探
  10. HDOJ 2802 F(N)
  11. Android横屏竖屏设置
  12. HDU 1217 Arbitrage(Floyd的应用)
  13. python 符合Python风格的对象
  14. Linux-问题集锦(1)
  15. VS2017安装包不占用C盘空间的方法,亲试
  16. day 20 - 1 序列化模块,模块的导入
  17. Elasticsearch安装部署教程
  18. python爬虫之urllib
  19. How to install Bekeley Extension Software Switch(BESS)?
  20. Kubernetes学习之路目录

热门文章

  1. mac OS 安装 Eclipse
  2. sphinx的使用
  3. POJ 2054 Color a Tree解题报告
  4. 数学--数论--HDU 2136(素数筛选法)
  5. CF906D Power Tower
  6. Naigos install pnp4nagios 绘图插件
  7. Python监控文件夹 && 发送邮件
  8. jQuery如何使用键盘事件,按住空格键完成进度条效果,并终止键盘事件
  9. Anaconda 常用命令大全
  10. [hdu4888]最大流,判断最大流唯一性