简介: 本篇简单测试一下递归和while的区别, 在处理一些计算问题时使用的最多的两种运算方式
文章均为个人原创, 搬运请附上原文地址感谢, 原文来自MasterYi博客
方法 | 执行时长 | 堆内存 | 总内存 |
---|---|---|---|
递归 | 0.20ms | 4.76M | 29.03M |
while | 0.16ms | 4.76M | 29.00M |
方法 | 执行时长 | 堆内存 | 总内存 |
---|---|---|---|
递归 | 1.31ms | 4.76M | 29.26M |
while | 0.42ms | 4.76M | 29.26M |
方法 | 执行时长 | 堆内存 | 总内存 |
---|---|---|---|
递归 | 21.73ms | 9.01M | 33.38M |
while | 3.65ms | 6.26M | 30.75M |
方法 | 执行时长 | 堆内存 | 总内存 |
---|---|---|---|
while | 9.15ms | 6.26M | 30.86M |
function f(n){
if(n === 1){
return n;
}
return n * f(n - 1)
}
f(5); // 120
let n = 5;
let num = 1; // 需要一个上层变量来存储上一次的变化
while (n > 1){
num = num * n;
n--;
}
console.log(num); // 120
// 首先模拟一个文件夹, 假设携带 children 为文件夹, 没有的就是文件
let folder = [
{
name: '学习资料',
children: [
{ name: 'TCP协议' },
{ name: '页面重绘问题' },
{ name: '资源竞态锁' },
{
name: 'CSS资料' ,
children: [
{ name: 'CSS弹性布局' },
{ name: 'CSS过渡动画' },
{ name: 'CSS伪类' }
]
}
]
},
{
name: '我的游戏',
children: [
{ name: 'LOL' },
{ name: 'DNF' },
{ name: 'QQ飞车' }
]
}
]
function search(name){
let stack = []; // 模拟执行栈
let result = []; // 用于存贮结果集
stack.push(...JSON.parse(JSON.stringify(folder))); // 模拟启动条件, 入栈要查询数组
while (stack.length) { // 只要栈内还有东西便继续执行
let item = stack.pop(); // 出栈执行
if(item.children){
stack.push(...item.children); // 判断为文件夹则继续入栈进行子集查找
}else{
if(item.name.indexOf(name) > -1) result.push(item);
}
}
return result;
}
console.log(search('LOL')); // [ { name: 'LOL' } ]
console.log(search('CSS')); // [ { name: 'CSS伪类' }, { name: 'CSS过渡动画' }, { name: 'CSS弹性布局' } ]