JavaScript累加、迭代、穷举、递归等常用算法实例小结


Posted in Javascript onMay 08, 2018

本文实例讲述了JavaScript迭代、迭代、穷举、递归等常用算法。分享给大家供大家参考,具体如下:

累加和累积

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

比如:将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.打印这个最大公约数*/
 var num1 = Number(prompt("请输入一个数"));
 var num2 = Number(prompt("请输入一个数"));
 var result = GCD(num1,num2);
 alert(result);
 /*
 * 函数的功能:得到最大公约数
 * 函数名:GCD
 * 函数的参数:俩个整数
 * 返回值:最大公约数*/
 /*
 * 如果num1<num2则交换,确保num1是交大的
 * 计算余数
 * 当num1(除数),对num2(被除数)的余数不为0,重复一下步骤
 * num2=>num1,
 * 余数=>num2
 * 重新计算余数
 * 最终的到最大公约数,也就是num2的值*/
 function GCD(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*/
 var month = Number(prompt("输入月份"));
 var rabbit = [1,1];
 for(var m=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(var cock=0;cock<=20;cock++){
  for(var hen=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的阶乘*/
 function fact(n){
  if(1== n){
   return 1
  }
   return n*fact(n-1);
 }
 alert(fact(5));
</script>

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

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

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery中的常用事件总结
Dec 27 Javascript
javascript 图片上一张下一张链接效果代码
Mar 12 Javascript
js页面跳转常用的几种方式
Nov 25 Javascript
什么是DOM(Document Object Model)文档对象模型
Mar 05 Javascript
jquery连缀语法如何实现
Nov 29 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
Mar 03 Javascript
浅析Bootstrip的select控件绑定数据的问题
May 10 Javascript
Javascript 判断两个IP是否在同一网段实例代码
Nov 28 Javascript
微信小程序实现倒计时60s获取验证码
Apr 17 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 Javascript
Vue-CLI项目中路由传参的方式详解
Sep 01 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
vue-cli 引入、配置axios的方法
May 08 #Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
May 08 #Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
May 08 #Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
May 08 #Javascript
详解基于mpvue的小程序markdown适配解决方案
May 08 #Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
May 08 #Javascript
浅谈React 服务器端渲染的使用
May 08 #Javascript
You might like
php&amp;java(三)
2006/10/09 PHP
用PHP和ACCESS写聊天室(十)
2006/10/09 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
python3.x实现发送邮件功能
2018/05/22 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
浅析Python 多行匹配模式
2020/07/24 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
接口可以包含哪些成员
2012/09/30 面试题
Java如何获得ResultSet的总行数
2016/09/03 面试题
新闻系毕业生推荐信
2013/11/16 职场文书
银行实习生的自我评价
2014/01/13 职场文书
卖车协议书
2014/04/21 职场文书
民族学专业求职信
2014/07/28 职场文书
暑期培训班策划方案
2014/08/26 职场文书
简易版租房协议书范本
2014/10/13 职场文书
开平碉楼导游词
2015/02/06 职场文书
护士个人年度总结范文
2015/02/13 职场文书
会计求职自荐信
2015/03/26 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang