昨天给大家介绍了面试时到底应该如何写出排序算法,也简单的介绍了一些方法

今天我们继续为大家介绍

前言

递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题。通常涉及函数调用自身。

能够像下面这样直接调用自身的方法或函数,是递归函数:

能够像下面这样间接调用自身的函数,也是递归函数:

假设现在必须要执行recursiveFunction,结果是什么?单单就上述情况而言,它会一直 执行下去。因此,每个递归函数都必须要有边界条件,即一个不再递归调用的条件(停止点), 以防止无限递归。

JavaScript调用栈大小的限制

如果忘记加上用以停止函数递归调用的边界条件,会发生什么呢?递归并不会无限地执行下 去;浏览器会抛出错误,也就是所谓的栈溢出错误(stack overflow error)。每个浏览器都有自己的上限,可用以下代码测试:

在Chrome v37中,这个函数执行了20955次,而后浏览器抛出错误RangeError: Maximum call stack size exceeded(超限错误:超过最大调用栈大小)。Firefox v27中,函数执行了343429次,然后浏览器抛出错误 InternalError: too much recursion(内部错误:递归次数过多)。

根据操作系统和浏览器的不同,具体数值会所有不同,但区别不大。

ECMAScript 6有尾调用优化(tail call optimization)。如果函数内最后一个操作是调用函数(就 像示例中加粗的那行),会通过“跳转指令”(jump) 而不是“子程序调用”(subroutine call)来 控制。也就是说,在ECMAScript 6中,这里的代码可以一直执行下去。所以,具有停止递归的边 界条件非常重要。

有关尾调用优化的更多相关信息,请访问http://goo.gl/ZdTZzg。

动态规划

动态规划(Dynamic Programming,DP)是一种将复杂问题分解成更小的子问题来解决的优化技术。

要注意动态规划和分而治之(归并排序和快速排序算法中用到的那种)是不同的方法。分而治之方法是把问题分解成相互独立的子问题,然后组合它们的答案,而动态规划则是将问题分解成相互依赖的子问题。

用动态规划解决问题时,要遵循三个重要步骤:

1. 定义子问题;

2.实现要反复执行而解决子问题的部分

3. 识别并求解出边界条件。

能用动态规划解决的一些著名的问题如下。

背包问题:给出一组项目,各自有值和容量,目标是找出总值最大的项目的集合。这个 问题的限制是,总容量必须小于等于“背包”的容量。

最长公共子序列:找出一组序列的最长公共子序列(可由另一序列删除元素但不改变余 下元素的顺序而得到)。

矩阵链相乘:给出一系列矩阵,目标是找到这些矩阵相乘的最高效办法(计算次数尽可 能少)。相乘操作不会进行,解决方案是找到这些矩阵各自相乘的顺序。

硬币找零:给出面额为d1…dn的一定数量的硬币和要找零的钱数,找出有多少种找零的 方法。

图的全源最短路径:对所有顶点对(u, v),找出从顶点u到顶点v的最短路径。

接下来的例子,涉及硬币找零问题的一个变种。

最少硬币找零问题

最少硬币找零问题是硬币找零问题的一个变种。硬币找零问题是给出要找零的钱数,以及可 用的硬币面额d1…dn及其数量,找出有多少种找零方法。最少硬币找零问题是给出要找零的钱数, 以及可用的硬币面额d1…dn及其数量,找到所需的最少的硬币个数。

例如,美国有以下面额(硬币):d1=1,d2=5,d3=10,d4=25。

如果要找36美分的零钱,我们可以用1个25美分、1个10美分和1个便士(1美分)。

如何将这个解答转化成算法?

最少硬币找零的解决方案是找到n所需的最小硬币数。但要做到这一点,首先得找到对每个 x<n的解。然后,我们将解建立在更小的值的解的基础上。

来看看算法:

为了更有条理,我们创建了一个类,解决给定面额的最少硬币找零问题。让我们一步步解读这个算法。

MinCoinChange类接收coins参数(行{1}),代表问题中的面额。对美国的硬币系统而言, 它是[1, 5, 10, 25]。我们可以随心所欲传递任何面额。此外,为了更加高效且不重复计算值, 我们使用了cache(行{2})。

接下来是makeChange方法,它也是一个递归函数,找零问题由它解决。首先,若amount 不为正(< 0),就返回空数组(行{3});方法执行结束后,会返回一个数组,包含用来找零的各 个面额的硬币数量(最少硬币数)。接着,检查cache缓存。若结果已缓存(行{4}),则直接返 回结果;否则,执行算法。

我们基于coins参数(面额)解决问题。因此,对每个面额(行{5}),我们都计算newAmount (行{6})的值,它的值会一直减小,直到能找零的最小钱数(别忘了本算法对所有的x < amount 都会计算makeChange结果)。若newAmount是合理的值(正值),我们也会计算它的找零结果(行 {7})。

最后,我们判断newAmount是否有效,minValue (最少硬币数)是否是最优解,与此同时 minValue和newAmount是否是合理的值({行10})。若以上判断都成立,意味着有一个比之前 更优的答案(行{11},以5美分为例,可以给5便士或者1个5美分镍币,1个5美分镍币是最优解)。最后,返回最终结果(行{12})。

测试一下这个算法:

要知道,如果我们检查cache变量,会发现它存储了从1到36美分的所有结果。以上代码的 结果是[1, 10, 25]。

最后,如果觉得好的话,不要忘记点个收藏或者赞同哦~或者私信我,加入有5000+前端大牛的社群哦

php算法求出一个数可以被分解成多少个_面试时写不出排序算法?看这篇就够了(下)...相关推荐

  1. php算法求出一个数可以被分解成多少个_小学奥数必须掌握的30个知识模块汇总...

    关注成长教育  解决学习困惑 点击蓝字关注,与全国家长比肩同行 1.和差倍问题和差问题 和倍问题 差倍问题已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数公式适用范围 已知两个数的和,差, ...

  2. php算法求出一个数可以被分解成多少个_最全的小学干货:34个数学重难点公式(三)...

    1.和差倍问题: 和差问题 和倍问题 差倍问题 已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数 公式适用范围 已知两个数的和,差,倍数关系 公式 ①(和-差)÷2=较小数 较小数+差=较 ...

  3. php算法求出一个数可以被分解成多少个_小学数学必考的34个数学重难点公式,赶紧给孩子收藏!...

    34个小学数学重难点公式 1.和差倍问题 2.年龄问题的三个基本特征 ①两个人的年龄差是不变的: ②两个人的年龄是同时增加或者同时减少的: ③两个人的年龄的倍数是发生变化的: 3.归一问题的基本特点 ...

  4. c++ 不插入重复元素但也不排序_面试时写不出排序算法?看这篇就够了

    小Hub领读: 本文主要详细讲述常见的八种排序算法的思想.实现以及复杂度.包括冒泡排序.快速排序.插入排序.希尔排序等等,文章讲解非常详细! 作者:静默虚空 https://juejin.im/pos ...

  5. php算法求出一个数可以被分解成多少个_程序员的算法趣题

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  6. 面试时写不出排序算法?看这篇就够了

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 作者:静默虚空 juejin.im/post/5cb6b8f551882532c334bcf2 ...

  7. C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  8. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7

    https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...

  9. [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

最新文章

  1. 使用centos6.6部署Cobbler--自动安装centos系统
  2. mybaits二十三:二级缓存
  3. Hadoop 同步集群时间ntp
  4. “约见”面试官系列之常见面试题之第九十一篇之简述Vue的生命周期适用于哪些场景(建议收藏)
  5. java test 用法,pytest基本用法简介
  6. python123程序设计实验答案_Python程序设计第二次实验报告
  7. Hive大数据-认识Hive知识结构_以及概念介绍---大数据之Hive工作笔记0001
  8. .inc文件是什么文件?
  9. LabVIEW 2011中文版下载及工具包下载
  10. C#调用matlab,matlab图形Figure嵌入Winform窗体
  11. 使用iconv进行GBK到BIG5编码转/简繁转换遇到的问题
  12. 百度网盘解析工具 利用IDM等工具提速下载
  13. DWT(离散小波变换)与其简单应用
  14. Gos —— 文件系统
  15. 亲测,2023年私藏的免费好用的磁力网盘资源搜索网站,找资源不用愁
  16. STP——BPDU报文
  17. 海洋cms单本小说网站模板
  18. Android SELinux开发入门指南之正确姿势解决访问data目录权限问题
  19. linux下的pmap命令
  20. 经验解答:计算机专业是什么?这个专业的大学生以后能干嘛?

热门文章

  1. 国家电网人工智能专利数量排名竟然靠前,腾讯,百度都不如国家电网
  2. Python的pip下载特定版本TensorFlow方法
  3. 图解数字签名Digital Signature 和数字证书Public-key certificate
  4. 华为nova 9 SE真机曝光:旗下首款一亿像素主摄 双环镜头吸睛
  5. 卖身1.8亿的背背佳身后,隐藏了一个“忽悠大师”
  6. 车主高速充电1小时排队4小时 国庆高速公路每日充电量创新高
  7. 虽然苏伊士运河大堵塞了,但是全球“玩家”收获了真实的快乐
  8. 张朝阳:未来文娱重点将拍更多网剧 发展UGC、短视频社交和直播社交
  9. 全球仅4人,刚毕业年薪201万元 !华为最高档“天才少年”回应...
  10. 结伴自驾游必备,高德地图上线组队实时对讲功能