迭代法

作者: 椰果粒 | 来源:发表于2019-03-28 14:35 被阅读0次

    什么是迭代法

    迭代法也叫辗转法,是一种不断利用旧变量的值,递推计算新变量的值的过程。
    和迭代法相对的是直接法,一次性解决问题。

    迭代法利用计算机运行速度快,适合做重复性操作的特点,让计算机对一组指令进行重复执行,每次执行这组执行时,都会从变量的原值推算出一个新值

    迭代法分类

    • 精确迭代
    • 近似迭代(二分法和牛顿迭代都是近似迭代)

    迭代法的例子

    寒舍王赏麦
    利用前一个格子麦子的数量(x),可以计算出后一个格子应当放入多少麦子(y)
    y = x*2

    用JS实现:

    /**
     * @description getNumberOfGrid 寒舍王赏麦,计算前n个格子共可以放多少个麦子
     * @param {number} grid:第几个格子
     * @return {number} :麦粒的总数
     * 
     */
    
     function getNumberOfGrid(grid){
       let sum = 0;   // 麦子总数
       let currentGrid = 0; // 当前格子的麦子数
       currentGrid = 1;
       sum += currentGrid;
       for(var i=2; i<=grid; i++){
         currentGrid *= 2;
         sum += currentGrid;
       }
       return sum;
     }
    

    在JavaScript中,最大的安全整数是(2的53次方-1)

    迭代法的具体应用

    迭代法运用在一下几个方面

    • 求数值的精确值或者是近似值:典型方法是二分法和牛顿迭代法
    • 在一定的范围内查找目标值:典型的方法是二分查找
    • 机器学习中的迭代:不了解,暂不研究

    求数值的精确值或者近似值
    求大于1的正整数(x)的平方根,不用Math.sqrt(),思路如下:

    这个结果y,取值范围为:1<y<x。也就是,从1到x之间,一定有一个数y,是x的平方根。

    采用的方法:迭代法中的二分法,每次检查区间中的值,看是否符合标准。

    举个栗子:查找15的平方根:


     /**
      * @description 给定一个数n,求n的平方根(二分法)
      * @param {*} 要计算输入的变量
      * @return n的平方根(取一个无限接近的值)
      */
     function sqrt(n){
      if(isNaN(n)) return NaN;  // 不是数值类型的,直接返回
      if(n===0 || n ===1) return n;
      let low = 0,
          high = n,
          mid = (low+high)/2,
          lastMid = mid;
      do{
        if(Math.pow(mid,2) > n){  // 平方根在中间的左侧
          high = mid
        }else if(Math.pow(mid,2) < n){  // 平方根在中间的右侧
          low = mid
        }else{  // 中间这个数就是平方根
          return mid
        }
        lastMid = mid;
        mid = (low+high)/2
      }while(Math.abs((lastMid-mid)) >= Number.EPSILON) // 只要满足在最小误差之内,就可以了
      return mid
     }
    

    相关文章

      网友评论

          本文标题:迭代法

          本文链接:https://www.haomeiwen.com/subject/xapavqtx.html