什么是迭代法
迭代法也叫辗转法,是一种不断利用旧变量的值,递推计算新变量的值的过程。
和迭代法相对的是直接法,一次性解决问题。
迭代法利用计算机运行速度快,适合做重复性操作的特点,让计算机对一组指令进行重复执行,每次执行这组执行时,都会从变量的原值推算出一个新值
迭代法分类
- 精确迭代
- 近似迭代(二分法和牛顿迭代都是近似迭代)
迭代法的例子
寒舍王赏麦
利用前一个格子麦子的数量(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
}
网友评论