详解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 相关文章推荐
使用JavaScript库还是自己写代码?
Jan 28 Javascript
基于Jquery的动态添加控件并取值的实现代码
Sep 24 Javascript
自动完成的搜索框javascript实现
Feb 26 Javascript
javascript作用域、作用域链(菜鸟必看)
Jun 16 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
Jul 05 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
Sep 14 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
关于vuex的学习实践笔记
Apr 05 Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 Javascript
详解js常用分割取字符串的方法
May 15 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中的一些数组排序方法分享
2012/07/20 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
JQuery 学习技巧总结
2010/05/21 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
Python如何实现转换URL详解
2019/07/02 Python
python模块常用用法实例详解
2019/10/17 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
selenium自动化测试入门实战
2020/12/21 Python
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
网络维护管理员的自我评价分享
2013/11/11 职场文书
采购主管的岗位职责
2013/12/17 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
企业人事任命书
2014/06/05 职场文书
金融保险专业求职信
2014/09/03 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python