递归算法中的小Tips

  • 记忆化
  • 尾递归
  • 快速幂

递归的基本操作已经在 二叉树的笔记中介绍了。但是在做题的过程中发现,递归还是有一些小技巧的。有时候一般的递归还有可能超出时间限制

记忆化

在递归的过程中,尤其是诸如斐波那契数列的计算过程中,由于递归的树形结构,经常会导致多余的计算量。因此,可以通过先建立一个HashMap将计算过的结果存入,便于后续调用。
诸如爬楼梯这道题,引入res后可以减少很多计算时间

    def climbStairs(self, n: int) -> int:res = {}def recur_fib(n):if n in res.keys():return res[n]if n <= 2:res[n] = nelse:res[n] = recur_fib(n-1) + recur_fib(n-2)return res[n]return recur_fib(n)

尾递归

尾递归其实不算是一种小trick,只是一种只在最后返回的时候进行一次的递归方式。
不过,递归过程中可能会存在一些计算变量的迭代。
例如,二叉树的最大深度

ps:判断一棵树是否是BST在每次迭代的时候都要加入low和high,而且不断迭代变换。

快速幂

在进行累乘的时候,显然你可以一次次的累乘
2n=2∗2∗2...∗22^n = 2*2*2...*22n=2∗2∗2...∗2
显然,这样存在很多的冗余计算,简化一下我们可以写成这样
2n=2n/2∗2n/22^n = 2^{n/2}*2^{n/2}2n=2n/2∗2n/2
这样的话,我们可以每次计算的时候直接计算一半即可。
这样,我们可以写出累乘的代码

class Solution:def myPow(self, x: float, n: int) -> float:if n > 0:return self.help(x,n)else:return 1/self.help(x,-n)def help(self,a,b):if b == 0: return 1half = self.help(a,b//2)if b % 2 == 0:return half*halfelse:return half*half*a

递归算法中的小Tips相关推荐

  1. 项目开发中的小tips

    2019独角兽企业重金招聘Python工程师标准>>> 一.泛型通配符:"?" java泛型中,当某种类型不确定时,可以使用未知类型?来代替,在Java集合框架中 ...

  2. php childnodes,小tips:HTML DOM中的children和childNodes属性

    childNodes 属性 标准的,childNodes 属性返回节点的子节点集合,以 NodeList 对象.包括HTML节点,所有属性,文本.可以通过nodeType来判断是哪种类型的节点,只有当 ...

  3. excel中#N/A的解释同比环比基比画四象限图的小tips字符串截取函数substitute的深入理解

    分组分析,同比环比定基比,字符串截取等问题的总结 EXCEL中#N/A,是"不适用"的意思,多用在填写表格的时候,表示"本栏目(对我)不适用",在没有东西可填写 ...

  4. 本人常用的一些编码小Tips(虽然不多,但很好用)

    本人常用的一些编码小Tips 我是可爱的目录 本人常用的一些编码小Tips 一.概述 二.Windows的一些常用的快捷键 (一).Win + others 类型 (二).Alt + others 类 ...

  5. 小TIPS:合拼gridview的header

    http://www.cnblogs.com/jackyrong/archive/2006/08/15/477791.html 小TIPS:合拼gridview的header 在asp.net 2.0 ...

  6. 不定期备考小tips[数模][0] #20210529

    不定期备考小tips[数模][0] #20210529 边值问题 S-L微分方程中两种内积的理解 一种内积:(u,v)=∫uvdx(u,v)=\int uvdx(u,v)=∫uvdx 另一种内积:(u ...

  7. 前端必备,5大mock省时提效小tips,用了提前下班一小时

    一.一些为难前端的业务场景 在我的工作经历里,需要等待后端童鞋配合我的情形大概有以下几种: a.我们跟外部有项目合作,需要调用到第三方接口. 一般这种情况下,商务那边谈合同,走流程,等第三方审核,我们 ...

  8. 前端防错以及好用小tips指南总结

    @前端防錯以及好用小tips指南總結 1.一般情況下我們接收到的都是對象格式,某些情況下,需要接到後端傳過來的奇怪的字符串格式的JSON,需要解析成對象,但是有時候他們傳過來的格式有問題,會報錯 解決 ...

  9. ANSI编码文件批量转换为UTF-8编码小tips

    ANSI编码文件批量转换为UTF-8编码小tips import chardet import os path = "C:\\Users\杜漪漪\Desktop\yunnan" # ...

最新文章

  1. 华人小哥控诉机器学习四大 Boring!CS 博士:深有同感,正打算退学
  2. 【深度学习篇】--神经网络中的调优二,防止过拟合
  3. Java 守护线程概述
  4. matlab impyramid,图像 – Matlab impyramid问题
  5. mysql 查看表v空间自增涨_MySQL InnoDB表空间加密
  6. java 网络编程connection timed out是什么意思_什么?听说这四个概念,很多 Java 老手都说不清...
  7. jquery 获取键值对中最大值_jQuery的AJAX发送数据键值对
  8. 谷歌开源漏洞扫描器“海啸”,专为大型企业服务
  9. vue 怎么设置 项目ico_vue项目如何优雅地设置favicon.ico
  10. LINUX查看剪贴板有哪些内容
  11. 数据包络分析法matlab,Matlab学习系列31数据包络分析法(DEA).docx
  12. call apply bind的作用和区别
  13. 什么是BI、ETL、DW
  14. centos环境更换IP地址为静态并且正常联网
  15. 云课堂软件工程(C编码实践篇)学习之我见
  16. 多角度解读新兴公链Sui:团队、架构、代币、生态等
  17. 【王喆-推荐系统】评估篇-(task2)推荐模型评估指标
  18. redis命令---redist键命令(key)---redis字符串命令(str)
  19. 微习惯瘦身,一天一个俯卧撑就够了吗?
  20. MatLab学习笔记(三)--控制语句与函数编程

热门文章

  1. 利用 element ui 进度条实现渐变 条纹进度条
  2. 揭秘 Google 成长史:荒诞梦想的副产品
  3. 基于Java的Minecraft游戏后端自定义插件 的Java实践项目整理
  4. linux 视频教程 韦山东,韦东山 linux 设备树详解
  5. Vue Hello world
  6. 两个小可爱的结对作业(司佳宇,雷镓)
  7. 18 -Flask构建弹幕微电影网站- 部署上线
  8. 【centos7静默(无图形界面版)本地离线安装oracle11g,附带个人建议】
  9. el-select动态清除value、el-input回车上传数据
  10. 点评美国名校的(EE)和(CS)