详解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 数组克隆方法 小结
Mar 20 Javascript
json原理分析及实例介绍
Nov 29 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 Javascript
Jquery实现自定义弹窗示例
Mar 12 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
解析Node.js异常处理中domain模块的使用方法
Feb 16 Javascript
Angular 理解module和injector,即依赖注入
Sep 07 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
Vue学习之路之登录注册实例代码
Jul 06 Javascript
基于JavaScript 性能优化技巧心得(分享)
Dec 11 Javascript
vue使用代理解决请求跨域问题详解
Jul 24 Javascript
微信小程序点击列表跳转到对应详情页过程解析
Sep 26 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
YB217、YB235、YB400浅听
2021/03/02 无线电
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
jquery异步请求实例代码
2011/06/21 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
Python深入学习之装饰器
2014/08/31 Python
深入浅析python继承问题
2016/05/29 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Python实现感知机(PLA)算法
2017/12/20 Python
python处理csv中的空值方法
2018/06/22 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
解决python 文本过滤和清理问题
2019/08/28 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
毕业实习评语
2014/02/10 职场文书
学生请假条格式
2014/04/11 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers
Redis全局ID生成器的实现
2022/06/05 Redis