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 相关文章推荐
js判断浏览器的比较全的代码
Feb 13 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
js中call与apply的用法小结
Dec 28 Javascript
js使用for循环与innerHTML获取选中tr下td值
Sep 26 Javascript
node.js中的http.createClient方法使用说明
Dec 15 Javascript
ECMAScript6新增值比较函数Object.is
Jun 12 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
Jun 24 Javascript
jQuery is not defined 错误原因与解决方法小结
Mar 19 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 Javascript
详解微信小程序的不同函数调用的几种方法
May 08 Javascript
javascript实现页面的实时时钟显示示例
Aug 06 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
Sep 02 Javascript
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目录函数实现创建、读取目录教程实例
2011/01/13 PHP
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
python文件比较示例分享
2014/01/10 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
园林技术个人的自我评价
2014/01/08 职场文书
活动总结报告格式
2014/05/09 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
mysql 获取时间方式
2022/03/20 MySQL