php算法求出一个数可以被分解成多少个_面试时写不出排序算法?看这篇就够了(下)...
昨天给大家介绍了面试时到底应该如何写出排序算法,也简单的介绍了一些方法
今天我们继续为大家介绍
前言
递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题。通常涉及函数调用自身。
能够像下面这样直接调用自身的方法或函数,是递归函数:
能够像下面这样间接调用自身的函数,也是递归函数:
假设现在必须要执行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算法求出一个数可以被分解成多少个_面试时写不出排序算法?看这篇就够了(下)...相关推荐
- php算法求出一个数可以被分解成多少个_小学奥数必须掌握的30个知识模块汇总...
关注成长教育 解决学习困惑 点击蓝字关注,与全国家长比肩同行 1.和差倍问题和差问题 和倍问题 差倍问题已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数公式适用范围 已知两个数的和,差, ...
- php算法求出一个数可以被分解成多少个_最全的小学干货:34个数学重难点公式(三)...
1.和差倍问题: 和差问题 和倍问题 差倍问题 已知条件 几个数的和与差 几个数的和与倍数 几个数的差与倍数 公式适用范围 已知两个数的和,差,倍数关系 公式 ①(和-差)÷2=较小数 较小数+差=较 ...
- php算法求出一个数可以被分解成多少个_小学数学必考的34个数学重难点公式,赶紧给孩子收藏!...
34个小学数学重难点公式 1.和差倍问题 2.年龄问题的三个基本特征 ①两个人的年龄差是不变的: ②两个人的年龄是同时增加或者同时减少的: ③两个人的年龄的倍数是发生变化的: 3.归一问题的基本特点 ...
- c++ 不插入重复元素但也不排序_面试时写不出排序算法?看这篇就够了
小Hub领读: 本文主要详细讲述常见的八种排序算法的思想.实现以及复杂度.包括冒泡排序.快速排序.插入排序.希尔排序等等,文章讲解非常详细! 作者:静默虚空 https://juejin.im/pos ...
- php算法求出一个数可以被分解成多少个_程序员的算法趣题
计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...
- 面试时写不出排序算法?看这篇就够了
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 作者:静默虚空 juejin.im/post/5cb6b8f551882532c334bcf2 ...
- C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进
[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...
- 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7
https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...
- [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进
[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...
最新文章
- 使用centos6.6部署Cobbler--自动安装centos系统
- mybaits二十三:二级缓存
- Hadoop 同步集群时间ntp
- “约见”面试官系列之常见面试题之第九十一篇之简述Vue的生命周期适用于哪些场景(建议收藏)
- java test 用法,pytest基本用法简介
- python123程序设计实验答案_Python程序设计第二次实验报告
- Hive大数据-认识Hive知识结构_以及概念介绍---大数据之Hive工作笔记0001
- .inc文件是什么文件?
- LabVIEW 2011中文版下载及工具包下载
- C#调用matlab,matlab图形Figure嵌入Winform窗体
- 使用iconv进行GBK到BIG5编码转/简繁转换遇到的问题
- 百度网盘解析工具 利用IDM等工具提速下载
- DWT(离散小波变换)与其简单应用
- Gos —— 文件系统
- 亲测,2023年私藏的免费好用的磁力网盘资源搜索网站,找资源不用愁
- STP——BPDU报文
- 海洋cms单本小说网站模板
- Android SELinux开发入门指南之正确姿势解决访问data目录权限问题
- linux下的pmap命令
- 经验解答:计算机专业是什么?这个专业的大学生以后能干嘛?
热门文章
- 国家电网人工智能专利数量排名竟然靠前,腾讯,百度都不如国家电网
- Python的pip下载特定版本TensorFlow方法
- 图解数字签名Digital Signature 和数字证书Public-key certificate
- 华为nova 9 SE真机曝光:旗下首款一亿像素主摄 双环镜头吸睛
- 卖身1.8亿的背背佳身后,隐藏了一个“忽悠大师”
- 车主高速充电1小时排队4小时 国庆高速公路每日充电量创新高
- 虽然苏伊士运河大堵塞了,但是全球“玩家”收获了真实的快乐
- 张朝阳:未来文娱重点将拍更多网剧 发展UGC、短视频社交和直播社交
- 全球仅4人,刚毕业年薪201万元 !华为最高档“天才少年”回应...
- 结伴自驾游必备,高德地图上线组队实时对讲功能