程序员的数学基础课
黄申
LinkedIn 资深数据科学家
83374 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
导读 (1讲)
基础思想篇 (18讲)
程序员的数学基础课
15
15
1.0x
00:00/00:00
登录|注册

03 | 迭代法:不用编程语言的自带函数,你会如何计算平方根?

Java代码演示
Java代码演示
牛顿迭代法
求解正整数的平方根
二分查找法
二分法
查找匹配记录
求数值的精确或者近似解
不断用旧的变量值递推计算新的变量值
应用
概念
迭代法
计算平方根

该思维导图由 AI 生成,仅供参考

你好,我是黄申。
今天我们来说一个和编程结合得非常紧密的数学概念。在解释这个重要的概念之前,我们先来看个有趣的小故事。
古印度国王舍罕酷爱下棋,他打算重赏国际象棋的发明人宰相西萨·班·达依尔。这位聪明的大臣指着象棋盘对国王说:“陛下,我不要别的赏赐,请您在这张棋盘的第一个小格内放入一粒麦子,在第二个小格内放入两粒,第三小格内放入四粒,以此类推,每一小格内都比前一小格加一倍的麦子,直至放满 64 个格子,然后将棋盘上所有的麦粒都赏给您的仆人我吧!”
国王自以为小事一桩,痛快地答应了。可是,当开始放麦粒之后,国王发现,还没放到第二十格,一袋麦子已经空了。随着,一袋又一袋的麦子被放入棋盘的格子里,国王很快看出来,即便拿来全印度的粮食,也兑现不了对达依尔的诺言。
放满这 64 格到底需要多少粒麦子呢?这是个相当相当大的数字,想要手动算出结果并不容易。如果你觉得自己非常厉害,可以试着拿笔算算。其实,这整个算麦粒的过程,在数学上,是有对应方法的,这也正是我们今天要讲的概念:迭代法(Iterative Method)。

到底什么是迭代法?

迭代法,简单来说,其实就是不断地用旧的变量值,递推计算新的变量值
我这么说可能还是有一点抽象,不容易理解。我们还回到刚才的故事。大臣要求每一格的麦子都是前一格的两倍,那么前一格里麦子的数量就是旧的变量值,我们可以先记作 ;而当前格子里麦子的数量就是新的变量值,我们记作 。这两个变量的递推关系就是这样的:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

迭代法在数学和计算机领域有着广泛的应用。本文以古印度国王舍罕的故事为引子,介绍了迭代法的概念和应用。通过放麦粒的故事引出迭代法的概念,然后以Java语言编写的程序计算了舍罕王给了多少粒麦子,展示了迭代法在实际问题中的应用。此外,文章还介绍了迭代法在数值解和查找匹配记录等领域的具体应用,包括二分法、牛顿迭代法、二分查找、机器学习算法中的迭代等。迭代法能够求解数值的精确或近似解,查找目标值,以及在机器学习算法中寻找局部最优解。通过具体应用,读者可以更好地理解迭代法的核心理念和实际应用场景。文章深入浅出地介绍了迭代法的核心思路,强调了迭代法在编程中的广泛应用,鼓励读者在实际项目中多加思考,尝试运用迭代法解决问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的数学基础课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(129)

  • 最新
  • 精选
  • 云韵
    置顶
    求一个数的平方根的那段代码中的第18行(double delta = Math.abs((square / n) - 1); )不太能看明白,为什么这么做?老师和专栏朋友们可以帮忙解决一下吗?谢谢。

    作者回复: 我这里使用了误差占原值的百分比,来控制迭代的结束

    2018-12-14
    4
    61
  • miracle
    class Lesson3_3里面第22行改成 int middle = left + (right - left)/2 会更合适一点,不然有可能会溢出

    作者回复: 对 很好的补充

    2018-12-14
    7
    123
  • Jerry银银
    老师,心里有点疑惑:感觉迭代法、数学归纳法有相关性,而且跟编程里面的循环和递归都有相关,您能否简要概括一下他们之间关系和联系呢?

    作者回复: 这是个很好的问题,确实有些地方让人容易糊涂。我这里谈谈自己的理解。 数学里的迭代法,最初是用来求解方程的根,通过不断的更新变量值来逼近最终的解。其思想也被用来计算数列、二分查找等等。我把这种迭代法称为广义的。 而数学归纳法呢,是从理论上证明某个命题成立,从而避免了迭代中的重复计算。下一篇会具体介绍。 而递归就是指“递推”和“回归”,它的递推和数学归纳法非常类似,因此数学归纳法中的递推可以直接翻译为递归的编程。而循环也有递推,不过通常和递归是反向的。 此外,人们常常把编程中的基于循环的实现叫做迭代的实现,用于和递归的实现加以区分。我个人觉得这种迭代的叫法是狭义的。广义的迭代既可以使用循环,也可以使用递归来实现,就像我第3讲的求根和二分查找等,也可以用递归来实现。

    2018-12-14
    88
  • 晓嘿
    老师 “唐瑞甫  2 class Lesson3_3里面第22行改成 int middle = left + (right - left)/2 会更合适一点,不然有可能会溢出 2018-12-14  作者回复 对 很好的补充” 这个我看着跟你写的那个是一样的啊,换算完也是(left+right)/2啊,这个22行的代码会溢出吗,在什么情况下

    作者回复: 确实从数学的角度看是一样的,但是计算机系统本身有局限性。如果left和right都是接近系统设定的最大值,那么两者相加会溢出。如果只加两者差值的一半,那么不会超过两者中较大的值,自然也不会溢出

    2018-12-14
    7
    57
  • Wing·三金
    目前正在做机器学习最优化方面的研究,所以对迭代法应用很多,几乎可以说是科研人员的必备手段了。 迭代法最困难的地方除了设置「迭代的规则」,另一个难点就是设置「迭代的终止条件」。前者专业性比较强就不多说,后者很大程度上依赖于coder的经验。因为机器学习中往往只要求足够精确的近似解,而如果一昧追求精度可能时间复杂度太大;如果以最大迭代次数为终止条件又可能得不到满意的解。因此实践中往往二者一起用,而且精度和迭代次数都需要根据一定的理论支撑去设定(不过更多的时候是从业界认可的经验出发)。

    作者回复: 很好的心得体会👍

    2018-12-15
    42
  • 耿森
    在贷款还款计算中,如果贷款方式是等额本金,那么每期的还款金额是根据上一期来计算的,要用到迭代法😄

    作者回复: 厉害了,非常好的生活实例

    2018-12-29
    2
    30
  • 柚子
    程序论递归和迭代区别,突然有个想法,好像将结束条件写在方法里就是递归,将结束条件写在方法外就是迭代。哈哈😄

    作者回复: 在编程里,递归的主要特征是方法或函数自己调用自己,因此一般结束条件放在方法内。而基于循环的迭代,如果递推是方法实现的,那确实结束条件是在方法外

    2018-12-14
    3
    25
  • WL
    没太看懂怎么用二分法查找同义词, 文章中讲的算法好像用二分法查询指定的单词, 不知道我这么理解对不对

    作者回复: 对 其实是精确匹配,匹配后就可以拿到这个词对应的同义或近义词

    2018-12-14
    2
    17
  • Shawn
    既然提到了求平方根就不得不说一下神奇的魔术字:0x5f3759df

    作者回复: 确实是个申请的数字,还研究了好久背后的数学知识

    2019-03-23
    4
    13
  • 彩色的沙漠
    快速排序,用的也是二分迭代思想,把一个数组分成两个独立部分。分别进行排序,直到两边都是有序

    作者回复: 是的,采用了分而治之的思想

    2018-12-19
    13
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部