Javascript迭代、递推、穷举、递归常用算法实例讲解


Posted in Javascript onFebruary 01, 2019

累加和累积

累加:将一系列的数据加到一个变量里面。最后的得到累加的结果

比如:将1到100的数求累加和

小球从高处落下,每次返回到原来一半,求第十次小球落地时小球走过的路程

<script>
  var h=100;
  var s=0;
  for(var i=0;i<10;i++){
    h=h/2;
    s+=h;
  }
  s=s*2+100;
</script>

累积:将一系列的数据乘积到一个变量里面,得到累积的结果。

常见的就是n的阶乘

var n=100;
var result= 1;
for(var i=1;i<=n;i++){
  result*=i;
}

一般形式:

累加:V +=e;

累积:v*=e;

V代表累加和累积,e代表累加/累积项

算法要点:

(1)   初始化

初始化v和e

累加:v = 0;

累积:v = 1;

e的初始化,如果累加/积项比较复杂,可能会分解为几个子项分别初始化,比如计算圆周率的问题,累计项分解为符号、分子和分母三部分。

(2)   循环的控制条件

一种是固定的次数,比如计算弹跳距离的问题,计算数列前20项之和的问题,

次数不固定,而是要满足某个条件:计算圆周率问题要求最后一项的绝对值,要小于10-6。

(3)   确定累加/积项的变化

比如数列的前20项之和,是将当前的分子分母之和作为下一次的分母,当前的分母作为分子。

再比如求圆周率问题,是将符号取反、分母加2,然后的出下一项。

迭代

迭代法也就是辗转法

规律:就是可以不断地用旧的值得到新的值,直到我们想要的得到的结果。

遇到了迭代的问题怎么解决

1.  找到迭代的变量(旧的值)

2.  确定迭代的关系

3.  知道想要的结果是什么(结束循环的条件)

  • (1)  就是知道最终结果
  • (2)  循环的次数
<script>
  /*
  * 1.接受用户输入的俩个数
  * 2.一个函数的到最大公约数
  * 3.打印这个最大公约数*/
  varnum1 = Number(prompt("请输入一个数"));
  var num2 = Number(prompt("请输入一个数"));
  var result = GCD(num1,num2);
  alert(result);
  /*
  * 函数的功能:得到最大公约数
  * 函数名:GCD
  * 函数的参数:俩个整数
  * 返回值:最大公约数*/
  /*
  * 如果num1<num2则交换,确保num1是交大的
  * 计算余数
  * 当num1(除数),对num2(被除数)的余数不为0,重复一下步骤
  * num2=>num1,
  * 余数=>num2
  * 重新计算余数
  * 最终的到最大公约数,也就是num2的值*/
  functionGCD(num1,num2){
    /*return0;*/
    if(num1<num2){
     var t = num1;
      num1=num2;
      num2 = t;
    }
    var remainder = num1%num2;
    while(remainder!= 0){
      num1=num2;
      num2= remainder;
      remainder=num1%num2;
    }
    returnnum2;
  }
</script>

递推

找到数学规律:通过公式计算到下一项的值,一直到我们要的结果为止

例如:兔子产子:通过前俩项得到下一项

<script>
  /*
  * 一般而言,兔子在出生俩个月后,就有繁殖能力
  * 一对兔子每个月能生出一对小兔子来
  * 如果所有的兔子都不死,那么一年以后总共有多少对兔子*/
  /*
  * 月份 0 1 2 3 4 5 6
  * 幼崽 1 1 1 2 3 5 8
  * 成年 0 0 1 1 2 3 5
  * 总共 1 1 2 3 5 8 13
  * */
  /*
  * 接收用户输入的月份
  * 计算兔子的对数
  * (1)如果经过的月份<2那么兔子的对数为1
  * (2)否则用初始的兔子的对数 加上  第一个月的对数为
  * 第二个月兔子的个数(an = an-1 +an-2)
  * 反复使用这个公式,计算出下个月兔子的个数一直到用户输入的月份为止
  * 打印的兔子的对数
  * */
  /* var month = Number(prompt("输入月份"));
   var sum ;
   var an =1;
   var an_1=1;
   var an_2;
   if(month < 2){
   sum=1;
   }else{
   sum=2;
   for(var i=1; i<month; i++){
   sum= an +an_1;
   an_1 =an;
   an = sum;
   }
   }
   alert(sum);*/
  /*
  * 思路2*/
  varmonth = Number(prompt("输入月份"));
  var rabbit = [1,1];
  for(varm=2;m<=month;m++){
    rabbit[m]=rabbit[m-1]+rabbit[m-2];
  }
  alert(rabbit[month]);
</script>

递推分为顺推和逆推。

穷举

遇到一个问题,找不到更好的解决办法,(找不到数学公式或者规律)时,使用“最笨”的办法,利用计算机计算速度快的特点,将所有可能性全部列出来

并将我们想要得到的结果记录下来

script>
  /*
  * 公鸡一值钱5,鸡母一值钱三,鸡仔三值钱一
  * 百钱买百鸡,问公鸡,鸡母、鸡仔各几何?
  * x y z
  * x + y + z = 100
  * x*5 + y * 3 + z/3 = 100*/
  for(varcock=0;cock<=20;cock++){
    for(varhen=0;hen<=33;hen++){
      var chihen=100-cock-hen;
      if(100== cock*5+ hen*3+ chihen/3){
        document.write("公鸡一共:"+cock+"鸡母一共:"+hen+"小鸡一共:"+chihen+"<br>")
      }
    }
  }
</script>

穷举方法的特点:是算法简单,相应的程序也简单,但是计算量往往很大。但是计算机的优势就是运算速度快,所以此算法可以扬长避短,往往可以取得不错的效果。

案例:有一个三位数,个位数字比百位数字大,而百位数字又比十位数字大,并且各位数字之和等于各位数字相乘之积,求此三位数

递归

所谓递归,就是在函数内部又去调用自己。

例如,求阶乘问题,在fact函数内部又去调用fact函数了

<script>
  /*计算n的阶乘*/
  functionfact(n){
    if(1== n){
      return1
    }
     returnn*fact(n-1);
  }
  alert(fact(5));
</script>

递归算法如果按照常规思路去理解是非常复杂的,函数调用一层一层嵌套调用,然后又一层一层返回,不妨换个思路去理解递归。

递归实际上就是将规模为n的问题降价为n-1的问题进行求解。也就是去找n和n-1之间的关系。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
js禁止小键盘输入数字功能代码
Aug 01 Javascript
jquery select多选框的左右移动 具体实现代码
Jul 03 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
简单选项卡 js和jquery制作方法分享
Feb 26 Javascript
Javascript获取当前日期的农历日期代码
Oct 08 Javascript
JavaScript模块化开发之SeaJS
Dec 13 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
Dec 06 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
Mar 08 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
jQuery实现动态生成年月日级联下拉列表示例
May 11 jQuery
Vue中实现回车键切换焦点的方法
Feb 19 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 Javascript
JS集合set类的实现与使用方法示例
Feb 01 #Javascript
详解如何使用webpack打包多页jquery项目
Feb 01 #jQuery
详解Vue中watch对象内属性的方法
Feb 01 #Javascript
JS字典Dictionary类定义与用法示例
Feb 01 #Javascript
在 Vue.js中优雅地使用全局事件的方法
Feb 01 #Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 #Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
Jan 31 #Javascript
You might like
php自动跳转中英文页面
2008/07/29 PHP
Linux中为php配置伪静态
2014/12/17 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
JS实现div居中示例
2014/04/17 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python使用django获取用户IP地址的方法
2015/05/11 Python
python utc datetime转换为时间戳的方法
2019/01/15 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
安全检查验收制度
2014/01/12 职场文书
对公司合理化的建议书
2014/03/12 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书