详解JavaScript中分解数字的三种方法


Posted in Javascript onJanuary 05, 2021

本文基于免费代码营基本算法脚本“分解数字”

在数学中,非负整数n的阶乘可能是一个棘手的算法。在本文中,我将解释这种方法,首先使用递归函数,第二种使用而循环,第三种使用以循环。

算法挑战

返回提供的整体的阶乘。

如果整体用字母n表示,则阶乘是所有小于或等于n的正整数的乘积。

阶乘经常用简写符号n!表示!

例如:5!= 1 * 2 * 3 * 4 * 5 = 120

function factorialize(num) {
 return num;
}
factorialize(5);

提供的测试用例

  • factorialize(0)应该返回1
  • factorialize(5)应该返回120
  • factorialize(10)应该返回3628800
  • factorialize(20)应该返回2432902008176640000

什么是因数分解?

当将一个因数分解时,就是称为数字乘以每个连续的数字减一个。

如果您的电话号码是5,则您将:

5! = 5 * 4 * 3 * 2 * 1

该模式为:

0! = 1
1! = 1
2! = 2 * 1
3! = 3 * 2 * 1
4! = 4 * 3 * 2 * 1
5! = 5 * 4 * 3 * 2 * 1

1.递归分解一个数字

function factorialize(num) {
 // If the number is less than 0, reject it.
 if (num < 0) 
  return -1;
 
 // If the number is 0, its factorial is 1.
 else if (num == 0) 
  return 1;
 
 // Otherwise, call the recursive procedure again
 else {
  return (num * factorialize(num - 1));
  /* 
  First Part of the recursion method
  You need to remember that you won't have just one call, you'll have several nested calls
  
  Each call: num === "?"     num * factorialize(num - 1)
  1st call ? factorialize(5) will return 5 * factorialize(5 - 1) // factorialize(4)
  2nd call ? factorialize(4) will return 4 * factorialize(4 - 1) // factorialize(3)
  3rd call ? factorialize(3) will return 3 * factorialize(3 - 1) // factorialize(2)
  4th call ? factorialize(2) will return 2 * factorialize(2 - 1) // factorialize(1)
  5th call ? factorialize(1) will return 1 * factorialize(1 - 1) // factorialize(0)
  
  Second part of the recursion method
  The method hits the if condition, it returns 1 which num will multiply itself with
  The function will exit with the total value
  
  5th call will return (5 * (5 - 1))  // num = 5 * 4
  4th call will return (20 * (4 - 1)) // num = 20 * 3
  3rd call will return (60 * (3 - 1)) // num = 60 * 2
  2nd call will return (120 * (2 - 1)) // num = 120 * 1
  1st call will return (120)    // num = 120
  
  If we sum up all the calls in one line, we have
  (5 * (5 - 1) * (4 - 1) * (3 - 1) * (2 - 1)) = 5 * 4 * 3 * 2 * 1 = 120
  */
 }
}
factorialize(5);

没有注释:

function factorialize(num) {
 if (num < 0) 
  return -1;
 else if (num == 0) 
  return 1;
 else {
  return (num * factorialize(num - 1));
 }
}
factorialize(5);

2.用WHILE循环分解一个数字

function factorialize(num) {
 // Step 1. Create a variable result to store num
 var result = num;
 
 // If num = 0 OR num = 1, the factorial will return 1
 if (num === 0 || num === 1) 
 return 1; 
 
 // Step 2. Create the WHILE loop 
 while (num > 1) { 
 num--; // decrementation by 1 at each iteration
 result = result * num; // or result *= num; 
 /* 
     num   num--  var result  result *= num   
 1st iteration: 5    4   5    20 = 5 * 4  
 2nd iteration: 4    3   20    60 = 20 * 3
 3rd iteration: 3    2   60   120 = 60 * 2
 4th iteration: 2    1   120   120 = 120 * 1
 5th iteration: 1    0   120
 End of the WHILE loop 
 */
 }
  
 // Step 3. Return the factorial of the provided integer
 return result; // 120
}
factorialize(5);

没有注释:

function factorialize(num) {
 var result = num;
 if (num === 0 || num === 1) 
 return 1; 
 while (num > 1) { 
 num--;
 result *= num;
 }
 return result;
}
factorialize(5);

3.使用FOR循环分解数字

function factorialize(num) {
 // If num = 0 OR num = 1, the factorial will return 1
 if (num === 0 || num === 1)
 return 1;
 
 // We start the FOR loop with i = 4
 // We decrement i after each iteration 
 for (var i = num - 1; i >= 1; i--) {
 // We store the value of num at each iteration
 num = num * i; // or num *= i;
 /* 
     num  var i = num - 1  num *= i   i--  i >= 1?
 1st iteration: 5   4 = 5 - 1   20 = 5 * 4  3   yes 
 2nd iteration: 20   3 = 4 - 1   60 = 20 * 3  2   yes
 3rd iteration: 60   2 = 3 - 1  120 = 60 * 2  1   yes 
 4th iteration: 120   1 = 2 - 1  120 = 120 * 1  0   no    
 5th iteration: 120    0    120
 End of the FOR loop 
 */
 }
 return num; //120
}
factorialize(5);

没有注释:

function factorialize(num) {
 if (num === 0 || num === 1)
 return 1;
 for (var i = num - 1; i >= 1; i--) {
 num *= i;
 }
 return num;
}
factorialize(5);

到此这篇关于详解JavaScript中分解数字的三种方法的文章就介绍到这了,更多相关js分解数字内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
修改js Calendar日历控件 兼容IE9/谷歌/火狐
Jan 04 Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
使用JS 清空File控件的路径值
Jul 08 Javascript
鼠标经过显示二级菜单js特效
Aug 13 Javascript
JavaScript获取flash对象与网上的有所不同
Apr 21 Javascript
再谈JavaScript线程
Jul 10 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
jQuery.extend 函数及用法详细
Sep 06 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
ReactNative实现Toast的示例
Dec 31 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
Feb 15 Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 #Vue.js
mapboxgl实现带箭头轨迹线的代码
Jan 04 #Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 #Vue.js
vue3弹出层V3Popup实例详解
Jan 04 #Vue.js
vue3自定义dialog、modal组件的方法
Jan 04 #Vue.js
three.js显示中文字体与tween应用详析
Jan 04 #Javascript
js用正则表达式筛选年月日的实例方法
Jan 04 #Javascript
You might like
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
微信小程序 引入es6 promise
2017/04/12 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
python 为什么说eval要慎用
2019/03/26 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
学期自我鉴定范文
2013/10/01 职场文书
应届生新闻编辑求职信
2013/11/19 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
惊天动地观后感
2015/06/10 职场文书
新学期开学标语2015
2015/07/16 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs