内容整理自:极客时间—程序员的数学基础课 03 | 迭代法:不用编程语言自带函数,你会如何计算平方根?

1. 什么是迭代法:

迭代法,简单来说,就是不断的用旧的变量值,来递推计算新的变量值。

2. 迭代法都有哪些具体应用

  1. 求数值的精确或者近似解:典型的方法包括二分法和牛顿迭代法。
  2. 在一定范围内查找目标值:典型的方法包括二分查找。
  3. 机器学习算法中的迭代:相关的模型和算法有很多,比如K- 均值算法(K-means clustering)、PageRank 的马尔科夫链(Markov chain)、梯度下降法(Gradient descent)等等。迭代法之所以在机器学习中广泛的使用,是因为很多时候,机器学习的过程,就是根据已知的数据和一定的假设,求一个局部最优解。而迭代法可以帮助学习算法逐步搜索,直至发现这种解。

3. 示例 求数值的解和查匹配记录

3.1 求数值的解

以求一个大于 1 的正数的平方根为例,如果不适用 Java 自带的 Math 类库,如何手动实现呢?

这个时间,我们就可以使用二分法查找最优解。举个例子,假如我们要求 10 的平方根,我们要先看一下 1到10 的中间值,就是 (1+10)/2 = 5.5,5.5的平方是大于10的,这个时候,我们就要看 1到5.5 的中间值,就是(1+5.5)/2 = 3.25,3.25的平方也是大于10的,然后继续,直到找到平方和等于10,或者平方和与10的差值在给定的精度范围内的值。

示例代码如下:

package match_programing.lesson3_iterator;/*** @Description 求数值的精确或者近似值* @author hjh**/
public class SqureRoot {/*** 计算大于 1 的正整数的平方根* @param n*        待求平方根的正数数* @param deltaThreshold*        误差的阈值 * @param maxTry*        二分查找的最大次数* @return double*        平方根的解*/public double getSqureRoot(int n, double deltaThreshold, int maxTry) {if (n <= 1) {return -1.0;}double min = 1.0, max = (double)n;for (int i = 0; i < maxTry; i++) {double middle = min + (max - min)/2;    // (min + max)/2 可能导致溢出double squre = middle * middle;double delta = Math.abs(squre/n -1);if (delta <= deltaThreshold) {return middle;}if (squre > n) {max = middle;}else {min = middle;}}return -2.0;    // 表示在指定的循环内,为找到匹配给定精度的值}/*** 测试代码*/public static void main(String[] args) {SqureRoot squreRoot = new SqureRoot();int n = 10;double squre = squreRoot.getSqureRoot(n, 0.0001, 100);if (squre == -1.0) {System.out.println("请输入大于 1 的正整数 ");}else if (squre == -2.0) {System.out.println("未能找到解 ");}else {System.out.println(String.format("%d 的平方根是 %s " , n, squre));    // 10 的平方根是 3.162384033203125}}
}

3.2 查找匹配记录

使用二分法查找匹配记录,其实现的思想和上面的求正整数的平方根是一样的,区别就是:

  1. 判断结束的条件不同:求平方根时,是通过判断 某个数的平方是否和输入相等或者满足给定的精度,查找匹配记录则是判断查找值是否与当前字符串相等。
  2. 二分查找需要确保被搜索的空间是有序的。

二分查找的过程如下:以 a-g 中7个字符查找 f 的过程为例:

示例代码如下:

package match_programing.lesson3_iterator;import java.util.Arrays;/*** 使用二分法查找匹配的记录* 前提: 查找范围必须有序* * @author Administrator**/
public class MatchRecord {/*** 使用二分法,在给定的有序数组中,查找指定的字符串* * @param dictionary*        有序字符串数组* @param wordToFind*        待查找的字符串* @return boolean*/public static boolean searcg(String[] dictionary, String wordToFind) {if (dictionary == null || dictionary.length == 0) {return false;}int left = 0, right = dictionary.length - 1;while (left <= right) {int middle = left + (right -left)/2;    // (right + left)/2 在right 和 left 都接近极限值时,会导致溢出if (dictionary[middle].equals(wordToFind)) {return true;}if (dictionary[middle].compareTo(wordToFind) > 0) {right = middle - 1;}else {left = middle + 1;}}return false;}/*** 测试代码*/public static void main(String[] args) {String[] dictionaryString = {"i", "am", "one", "of", "the", "authors", "in", "geekbang"};Arrays.sort(dictionaryString);    // 二分查找必须在有序集合中使用String wordToFind = "i";boolean found = MatchRecord.searcg(dictionaryString, wordToFind);if (found) {System.out.println(String.format("找到了单词 %s ", wordToFind));    // 输出:找到了单词 i}else {System.out.println(String.format("未能找到单词 %s", wordToFind));}}}

说明:文中使用的图片来自极客时间,版权归极客时间所有。

不用编程语言自带函数,你会如何实现计算平方根相关推荐

  1. 技术派-不用sqrt手工计算平方根

    题目:任意长度数串,不使用sqrt函数,手工计算平方根? 要求只准用加/减/乘/除四则运算,不准使用power/sqrt等函数. 算法如下: 1.以小数点为中心往两边每2位分隔为一组: 2.然后以组为 ...

  2. python perl lisp_巴别塔-编程语言之旅【转】——C、C++、Lisp、Java、Perl、Ruby、Python核心比较...

    译者:qinjian623原文作者:Steve Yegge 说明 但是由于文章内容比较和我胃口,还是决定再翻译一个版本. 巴别塔 这是我自己混乱的编程语言之旅,原本准备这个月写给ADJ(Amazon ...

  3. 编程语言种类这么多,学过5种以上就是大神!

    编程语言的种类与特点 编程,是指让计算机为解决某个问题,而使用某种程序语言编写程序代码,并最终得到结果的过程.为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路.方法.和手段通过计算机能够 ...

  4. 常用的编程语言介绍以及各语言的特点(前端,前端框架,后端)

    常用的编程语言介绍以及各语言的特点 编程语言(programming language),是用来定义计算机程序的形式语言.它是一种被标准化的交流技巧,用来向计算机发出指令.一种计算机语言让程序员能够准 ...

  5. 周一02.1编程语言介绍

    编程语言介绍 编程语言1)机器语言:直接用计算机能听懂的二进制指令去编写程序,需要了解硬件的细节 2)汇编语言:用英文标签取代二进制指令去编写程序,同样需要了解硬件的细节 3)高级语言:直接用人类能理 ...

  6. 不用sqrt实现平方根_如何在R中使用sqrt()查找平方根?

    不用sqrt实现平方根 Getting a square root of the values in R is easy with the function sqrt() in R. Let's fi ...

  7. 学会这27种编程语言,你还怕找不到女朋友?!那是要几个有几个!

    我就知道你们会点进来看对不对,为什么我会这么说呢?看完以下内容再私信小编,小编就告诉你. 27 种语言: 过程型编程语言: C, Rust, Cython 面向对象数据建模语言: Java, C#, ...

  8. 信息学奥林匹克竞赛-编程语言

    主流编程语言简介 计算机语言的种类非常的多,总的来说可以分成 机器语言,汇编语言,高级语言 三大类. 机器语言:是直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码,它们有一定的位数, ...

  9. 基石为勤能补拙的迷宫之旅——第二天(编程语言介绍、Python解释器介绍与安装、执行Python程序的方式和变量)

    一. 编程语言介绍 1.1 机器语言 直接用计算机能理解的二进制指令编写程序,直接控制硬件 1.2 汇编语言 用英文标签取代二进制指令取编写程序,本质也是在直接控制硬件 1.3 高级语言 用人能理解的 ...

  10. 各种编程语言的优缺点

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1 万物之源C语言 难度:★★★  人气:★★★★★ C语言是一种 ...

最新文章

  1. Tomcat指定特定JDK版本
  2. 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  3. json 是个什么东西?
  4. freemarker模板引擎 常用标签
  5. GM6 pageset - DB get scenario
  6. 养成让自己进步的10个习惯
  7. mysql 失效转移_MySQL基于MHA的FailOver过程
  8. 怎样才能做好技术团队管理
  9. k8s启动Pod报错CrashLoopBackOff
  10. Oracle一次性查询超过1000条数据的方法(分批查询)
  11. python datetime strftime_datetime.strftime时间输出转换
  12. 数据库简单sql语句(CURD)
  13. 2019年程序员岗位招聘信息分析
  14. 混沌,分形与人工智能
  15. 静态代码扫描环境搭建(mac)
  16. day39 python 学习 数据库学习 五个约束,数据库设计(一对一,一对多等等)
  17. LINUX下如何查看内存品牌和速率啊?
  18. android修改按键映射,【图片】修改按键映射和组合键教程【安卓dolphin模拟器吧】_百度贴吧...
  19. 基于SSM框架的员工信息管理系统
  20. Pymol教程--蛋白位点突变

热门文章

  1. matlab中nc值是什么意思,科学网-.nc数据读取详细资料matlab2010a及后面的版本-张凌的博文...
  2. C# wpf 自定义标题栏及无边框窗口
  3. shell中的let命令
  4. linux用户目录互信,linux 互信不生效
  5. linux服务添加互信,Linux多节点互信配置
  6. C语言《填数游戏》全流程
  7. vivado_hls 与 modelsim 联合仿真时报错,Failed to access library ‘unisims_ver‘ at “unisims_ver“
  8. c语言数学函数指数,C语言数学函数参考表
  9. Date setMonth(date.getMonth - 1)
  10. GLM 中的mat4