03 | 迭代法:不用编程语言的自带函数,你会如何计算平方根?
03 | 迭代法:不用编程语言的自带函数,你会如何计算平方根?
讲述:黄申
时长11:38大小10.67M
到底什么是迭代法?
迭代法有什么具体应用?
1. 求方程的精确或者近似解
2. 查找匹配记录
小结
思考题
赞 34
提建议
精选留言(127)
- 云韵置顶2018-12-14求一个数的平方根的那段代码中的第18行(double delta = Math.abs((square / n) - 1); )不太能看明白,为什么这么做?老师和专栏朋友们可以帮忙解决一下吗?谢谢。
作者回复: 我这里使用了误差占原值的百分比,来控制迭代的结束
共 4 条评论59 - miracle2018-12-14class Lesson3_3里面第22行改成 int middle = left + (right - left)/2 会更合适一点,不然有可能会溢出
作者回复: 对 很好的补充
共 7 条评论118 - Jerry银银2018-12-14老师,心里有点疑惑:感觉迭代法、数学归纳法有相关性,而且跟编程里面的循环和递归都有相关,您能否简要概括一下他们之间关系和联系呢?
作者回复: 这是个很好的问题,确实有些地方让人容易糊涂。我这里谈谈自己的理解。 数学里的迭代法,最初是用来求解方程的根,通过不断的更新变量值来逼近最终的解。其思想也被用来计算数列、二分查找等等。我把这种迭代法称为广义的。 而数学归纳法呢,是从理论上证明某个命题成立,从而避免了迭代中的重复计算。下一篇会具体介绍。 而递归就是指“递推”和“回归”,它的递推和数学归纳法非常类似,因此数学归纳法中的递推可以直接翻译为递归的编程。而循环也有递推,不过通常和递归是反向的。 此外,人们常常把编程中的基于循环的实现叫做迭代的实现,用于和递归的实现加以区分。我个人觉得这种迭代的叫法是狭义的。广义的迭代既可以使用循环,也可以使用递归来实现,就像我第3讲的求根和二分查找等,也可以用递归来实现。
87 - 晓嘿2018-12-14老师 “唐瑞甫 2 class Lesson3_3里面第22行改成 int middle = left + (right - left)/2 会更合适一点,不然有可能会溢出 2018-12-14 作者回复 对 很好的补充” 这个我看着跟你写的那个是一样的啊,换算完也是(left+right)/2啊,这个22行的代码会溢出吗,在什么情况下展开
作者回复: 确实从数学的角度看是一样的,但是计算机系统本身有局限性。如果left和right都是接近系统设定的最大值,那么两者相加会溢出。如果只加两者差值的一半,那么不会超过两者中较大的值,自然也不会溢出
共 7 条评论55 - Wing·三金2018-12-15目前正在做机器学习最优化方面的研究,所以对迭代法应用很多,几乎可以说是科研人员的必备手段了。 迭代法最困难的地方除了设置「迭代的规则」,另一个难点就是设置「迭代的终止条件」。前者专业性比较强就不多说,后者很大程度上依赖于coder的经验。因为机器学习中往往只要求足够精确的近似解,而如果一昧追求精度可能时间复杂度太大;如果以最大迭代次数为终止条件又可能得不到满意的解。因此实践中往往二者一起用,而且精度和迭代次数都需要根据一定的理论支撑去设定(不过更多的时候是从业界认可的经验出发)。展开
作者回复: 很好的心得体会👍
38 - Gy2020-07-31第1个格子里的小麦有1粒 第2个格子里的小麦有2粒 第3个格子里的小麦有4粒 第4个格子里的小麦有8粒 第5个格子里的小麦有16粒 第6个格子里的小麦有32粒 第7个格子里的小麦有64粒 第8个格子里的小麦有128粒 第9个格子里的小麦有256粒 第10个格子里的小麦有512粒 第11个格子里的小麦有1024粒 第12个格子里的小麦有2048粒 第13个格子里的小麦有4096粒 第14个格子里的小麦有8192粒 第15个格子里的小麦有16384粒 第16个格子里的小麦有32768粒 第17个格子里的小麦有65536粒 第18个格子里的小麦有131072粒 第19个格子里的小麦有262144粒 第20个格子里的小麦有524288粒 第21个格子里的小麦有1048576粒 第22个格子里的小麦有2097152粒 第23个格子里的小麦有4194304粒 第24个格子里的小麦有8388608粒 第25个格子里的小麦有16777216粒 第26个格子里的小麦有33554432粒 第27个格子里的小麦有67108864粒 第28个格子里的小麦有134217728粒 第29个格子里的小麦有268435456粒 第30个格子里的小麦有536870912粒 第31个格子里的小麦有1073741824粒 第32个格子里的小麦有2147483648粒 第33个格子里的小麦有4294967296粒 第34个格子里的小麦有8589934592粒 第35个格子里的小麦有17179869184粒 第36个格子里的小麦有34359738368粒 第37个格子里的小麦有68719476736粒 第38个格子里的小麦有137438953472粒 第39个格子里的小麦有274877906944粒 第40个格子里的小麦有549755813888粒 第41个格子里的小麦有1099511627776粒 第42个格子里的小麦有2199023255552粒 第43个格子里的小麦有4398046511104粒 第44个格子里的小麦有8796093022208粒 第45个格子里的小麦有17592186044416粒 第46个格子里的小麦有35184372088832粒 第47个格子里的小麦有70368744177664粒 第48个格子里的小麦有140737488355328粒 第49个格子里的小麦有281474976710656粒 第50个格子里的小麦有562949953421312粒 第51个格子里的小麦有1125899906842624粒 第52个格子里的小麦有2251799813685248粒 第53个格子里的小麦有4503599627370496粒 第54个格子里的小麦有9007199254740992粒 第55个格子里的小麦有18014398509481984粒 第56个格子里的小麦有36028797018963968粒 第57个格子里的小麦有72057594037927936粒 第58个格子里的小麦有144115188075855872粒 第59个格子里的小麦有288230376151711744粒 第60个格子里的小麦有576460752303423488粒 第61个格子里的小麦有1152921504606846976粒 第62个格子里的小麦有2305843009213693952粒 第63个格子里的小麦有4611686018427387904粒 第64个格子里的小麦有9223372036854775808粒 国王一共给了18446744073709551615粒麦子展开共 5 条评论31
- 耿森2018-12-29在贷款还款计算中,如果贷款方式是等额本金,那么每期的还款金额是根据上一期来计算的,要用到迭代法😄
作者回复: 厉害了,非常好的生活实例
共 2 条评论30 - 柚子2018-12-14程序论递归和迭代区别,突然有个想法,好像将结束条件写在方法里就是递归,将结束条件写在方法外就是迭代。哈哈😄
作者回复: 在编程里,递归的主要特征是方法或函数自己调用自己,因此一般结束条件放在方法内。而基于循环的迭代,如果递推是方法实现的,那确实结束条件是在方法外
共 3 条评论24 - WL2018-12-14没太看懂怎么用二分法查找同义词, 文章中讲的算法好像用二分法查询指定的单词, 不知道我这么理解对不对
作者回复: 对 其实是精确匹配,匹配后就可以拿到这个词对应的同义或近义词
共 2 条评论17 - Shawn2019-03-23既然提到了求平方根就不得不说一下神奇的魔术字:0x5f3759df
作者回复: 确实是个申请的数字,还研究了好久背后的数学知识
共 4 条评论12 - 彩色的沙漠2018-12-19快速排序,用的也是二分迭代思想,把一个数组分成两个独立部分。分别进行排序,直到两边都是有序
作者回复: 是的,采用了分而治之的思想
13 - 瘦马2018-12-14迭代的基本思想就是不断用旧的变量推算出新的变量,直到获得有效结果。 迭代使用的步骤: 1、确定变量 2、确定变量的推导方式 3、控制迭代10
- 代码世界没有爱情2018-12-17python实现: def f(x): y = x if x > 1 and isinstance(x, int): flag, num = 1, 0 global middle while num <= 100: middle = (x + flag) / 2 if middle * middle > y: x = middle elif middle * middle < y: flag = middle else: print('exactly value:', middle) break num += 1 else: print('deferenct value:', middle) elif x ==1:print('exactly value:', 1) else: print('TypeError') f(81)展开共 1 条评论8
- Eleven2019-11-09举个例子,假如我们要找到 10 的平方根。我们需要先看 1 到 10 的中间数值,也就是 11/2=5.5。5.5 的平方是大于 10 的,所以我们要一个更小的数值,就看 5.5 和 1 之间的 3.25。由于 3.25 的平方也是大于 10 的,继续查看 3.25 和 1 之间的数值,也就是 2.125。这时,2.125 的平方小于 10 了,所以看 2.125 和 3.25 之间的值,一直继续下去,直到发现某个数的平方正好是 10。 老师,我想问一下,这个地方为什么是从11开始二分?展开
作者回复: 因为这里是从1开始,所以(10+1)/2=5.5。之所以从1开始而不是0,是假设我们已经知道0~1之间的数,平方也是小于1,不可能到10。
4 - 我不是王子2018-12-15老师,求平方根的第18行我也没看懂,可以详细讲解一下吗,为什么是(square / n) - 1再求绝对值呢
作者回复: 这是算相对误差,比如n是100,那么误差为1的时候,误差相对于n的百分比为1%。
4 - silence2018-12-14迭代就是将问题相同的部分抽离出来,把不容易解决的大问题切割成一个个小问题
作者回复: 递归式的迭代可以将大问题逐步简化为小问题
4 - 指间砂的宿命2018-12-14二分法很少手写,程序中更多使用循环语句,不过对于有序数据查找二分法倒是相对高效,工作中倒是很少用,特别是有数据库的情况下指定key很多时候都是直接让数据库返回了
作者回复: 有些数据库的索引,具体实现的时候可能会用到二分查找
4 - 罗耀龙@坐忘2020-03-25茶艺师学编程 曾经和同事玩过这样的游戏。 在试完一款茶后,估计这款茶的价钱。对方知道答案,而我来猜。 一上来,我“1280”开局。 “高了。” 那么1280/2,“640” “低了” 这样啊,但范围可以确定在区间[640,1280],那就取个中值,“960” “低了” 范围进一步缩小,[960,1280],继续取中值,“1120” “高了” [960,1120],“1040” “你有完没完,低了!” 别急嘛,[1040,1120],“1080” “咋这么笨呢,1088!不玩啦。” 虽然看上去是很机械,迭代法就是外行人可用的有效策略。展开
作者回复: 对,2分逼近
3 - kylin2018-12-17请问class3_3中的22行 int mid = (left + right) / 2 为啥会可能有溢出,如果改成int mid = left + (right - left) / 2 就不会溢出了呢?
作者回复: 理论上两者一样。主要是当left和right都趋近于计算机系统设定的最大值时,就可能溢出,你可以画个图试试看
3 - 蒋宏伟2018-12-15迭代法 why 利用计算机适合重复计算的特点 how f(0)= 确定迭代的变量 f(n) = g(f(n-1)) 建立迭代变量之间的递推关系 g = 控制迭代的过程 what 让计算机重复执行,推导出最终值 类比 for while 应用 在一定范围内查找目标值(缩小) 通过二分法定位 BUG 通过二分法实现 Math.sqrt 重复执行递推计算结果(增加) 计算国际象棋放置的麦粒数展开3