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

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

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

    作者回复: 对 很好的补充

    
     72
  • 晓嘿
    2018-12-14
    老师
    “唐瑞甫
    
    2
    class Lesson3_3里面第22行改成 int middle = left + (right - left)/2 会更合适一点,不然有可能会溢出
    2018-12-14
     作者回复
    对 很好的补充”

    这个我看着跟你写的那个是一样的啊,换算完也是(left+right)/2啊,这个22行的代码会溢出吗,在什么情况下
    展开

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

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

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

    
     33
  • Wing·三金
    2018-12-15
    目前正在做机器学习最优化方面的研究,所以对迭代法应用很多,几乎可以说是科研人员的必备手段了。

    迭代法最困难的地方除了设置「迭代的规则」,另一个难点就是设置「迭代的终止条件」。前者专业性比较强就不多说,后者很大程度上依赖于coder的经验。因为机器学习中往往只要求足够精确的近似解,而如果一昧追求精度可能时间复杂度太大;如果以最大迭代次数为终止条件又可能得不到满意的解。因此实践中往往二者一起用,而且精度和迭代次数都需要根据一定的理论支撑去设定(不过更多的时候是从业界认可的经验出发)。

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

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

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

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

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

     1
     15
  • 瘦马
    2018-12-14
    迭代的基本思想就是不断用旧的变量推算出新的变量,直到获得有效结果。
    迭代使用的步骤:
    1、确定变量
    2、确定变量的推导方式
    3、控制迭代
    
     7
  • 耿森
    2018-12-29
    在贷款还款计算中,如果贷款方式是等额本金,那么每期的还款金额是根据上一期来计算的,要用到迭代法😄

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

    
     6
  • 彩色的沙漠
    2018-12-19
    快速排序,用的也是二分迭代思想,把一个数组分成两个独立部分。分别进行排序,直到两边都是有序

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

    
     6
  • Shawn
    2019-03-23
    既然提到了求平方根就不得不说一下神奇的魔术字:0x5f3759df

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

    
     4
  • silence
    2018-12-14
    迭代就是将问题相同的部分抽离出来,把不容易解决的大问题切割成一个个小问题

    作者回复: 递归式的迭代可以将大问题逐步简化为小问题

    
     4
  • 代码世界没有爱情
    2018-12-17
    python实现:
    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
     3
  • 我不是王子
    2018-12-15
    老师,求平方根的第18行我也没看懂,可以详细讲解一下吗,为什么是(square / n) - 1再求绝对值呢

    作者回复: 这是算相对误差,比如n是100,那么误差为1的时候,误差相对于n的百分比为1%。

    
     3
  • 蒋宏伟
    2018-12-15
    迭代法
        why
            利用计算机适合重复计算的特点
        how
            f(0)=
                确定迭代的变量
            f(n) = g(f(n-1))
                建立迭代变量之间的递推关系
            g =
                控制迭代的过程
        what
            让计算机重复执行,推导出最终值
        类比
            for
            while
        应用
            在一定范围内查找目标值(缩小)
                通过二分法定位 BUG
                通过二分法实现 Math.sqrt
            重复执行递推计算结果(增加)
                计算国际象棋放置的麦粒数
    展开
    
     3
  • Eleven
    2019-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。

    
     2
  • (+曦+)
    2018-12-14
    7皇后问题
    
     2
  • 指间砂的宿命
    2018-12-14
    二分法很少手写,程序中更多使用循环语句,不过对于有序数据查找二分法倒是相对高效,工作中倒是很少用,特别是有数据库的情况下指定key很多时候都是直接让数据库返回了

    作者回复: 有些数据库的索引,具体实现的时候可能会用到二分查找

    
     2
  • escray
    2019-12-23
    仿写了一段 Python 代码,主要是被之前留言里面的代码惊到了

    ```python
    def getSquareRoot(n, deltaThreshold, maxTry):
        if not isinstance(n, int):
            print('TypeError')
        if n <= 1:
            return -1.0
        min, max = 1.0, n
        for i in range(1,maxTry):
            middle = min + (max - min) / 2
            square = middle * middle
            delta = abs((square/n) - 1)
            if delta <= deltaThreshold:
                return middle
            else:
                if square > n:
                    max = middle
                else:
                    min = middle
        return -2.0

    if __name__ == '__main__':
        num = 10
        squareRoot = getSquareRoot(num, 0.0000001, 10000)

        if squareRoot == -1.0:
            print(" please input number greater 1 ")
        elif squareRoot == -2.0:
            print(" cannot find square root ")
        else:
            print("{} square root is {}".format(num, squareRoot));
    ```
    展开
    
     1
  • 好大一颗TREE
    2019-06-16
    这和定义的数据类型有关,即两个无线趋近于Int类型的数字相加会大于int类型的最大值
    
     1
我们在线,来聊聊吧