JavaScript实现的一个计算数字步数的算法分享


Posted in Javascript onDecember 06, 2014

这两天看了下某位大神的github,知道他对算法比较感兴趣,看了其中的一个计算数字的步数算法,感觉这个有点意思,所以就自己实现了一个。

算法描述与实现原理

给出一个整型数字,统计出有多少种走法可以到达目标,比如一个数字4,可以有下面几种走法

    [ 1, 3 ]

        [ 4 ]

    [ 1, 1, 2 ]

        [ 2, 2 ]

    [ 1, 1, 1, 1 ]

其实通过上面的组合可以得出下面的结论。

1.先列出所有项是1的组合
2.依次从左到右项为1的组合
3.递归上面的集合,找出项里1的索引,然后计算左起2项的值,结果递归此操作
4.排除1和2的情况

下面先提供三个工具函数:

// 计算数组内的值

function calculate(arg){

    return eval(arg.join('+'));

}
// 输出数组的值

function print(arg){

    for(var i = 0; i < arg.length; i++){

        console.log(arg[i]);

    }

}
// 检查是否是正反的走法

function hasRepeat(src, dist){

    if (dist.length != 2) return false;

    for(var i = 0, len = src.length; i < len ; i++){

        if(dist.length == src[i].length){

            if(dist[0] == src[i][1]){

                return true;

            }

        }

    }

    return false;

}

下面贴出算法的实现:

function countSteps(n){

    var counts = 0,i,j = 0;

    var result = [];

    var newresult = [];

    var source = [];

    var temparg = [];

    // 生成项全为1的数组

    for(i = 1; i <= n ; i++){

        source.push(1);

    }

    if(n > 2){

        for(j = 1; j < n - 1; j++){

            temparg.length = 0;

            if(j < n - 1){

                // 生成从左到右项为1递增的数组

                // 1.. 11.. 111..

                Array.prototype.push.apply(temparg, source.slice(0, j));

                temparg.push(calculate(source.slice(j,n)));

                result.push(temparg.slice(0));

                // 递归数组里的内容,直到项里没有1为止

                combine(temparg.slice(0));

            }

        }

    }

    // 组合包含1的数组项

    // 111->21->3

    function combine(arg){

        var linearg = [];

        for(var i = 0; i < arg.length; i++){

            if(arg[i] == 1){

                if(i ==0 || i == 1){

                    linearg.push(calculate(arg.slice(0,2)));

                    Array.prototype.push.apply(linearg, arg.slice(2, arg.length));

                    if(!hasRepeat(result, linearg)){

                        result.push(linearg);

                        combine(linearg.slice(0));

                    }

                    return;

                }

            }

        }

    }

    //为2的时候比1要多一项

    if(n == 2){

        result.push([2]);

    }

    // 添加全为1的情况

    result.push(source);

    // 输出所有步

    print(result);

    console.log('总共有:' + result.length + '种走法');

}
// 运行

countSteps(4);
// 输出下面内容

/*

    [ 1, 3 ]

    [ 4 ]

    [ 1, 1, 2 ]

    [ 2, 2 ]

    [ 1, 1, 1, 1 ]

    总共有:5种走

*/

总结

这个算法其实可以应用到某类游戏中去,当两个物体之前的距离一定的话,对所有的可能进行业务处理,当然也可以应用到别的地方,虽然大部分前端工程师对算法的实践比较少,不过它还是有存在的价值的,很多UI细节方面其实都运用了算法,以后有空还会贴更多关于算法相关的文章,欢迎大家多提些宝贵意见.

Javascript 相关文章推荐
js实现ASP分页函数 HTML分页函数
Sep 22 Javascript
插件:检测javascript的内存泄漏
Mar 04 Javascript
用JQuery调用Session的实现代码
Oct 29 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
Jun 28 Javascript
qq悬浮代码(兼容各个浏览器)
Jan 29 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
Dec 20 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
jquery在vue脚手架中的使用方式示例
Aug 29 jQuery
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
Vue实现简易翻页效果源码分享
Nov 08 Javascript
Vue点击切换Class变化,实现Active当前样式操作
Jul 17 Javascript
js 实现碰撞检测的示例
Oct 28 Javascript
angularjs中的e2e测试实例
Dec 06 #Javascript
angularjs中的单元测试实例
Dec 06 #Javascript
angularjs指令中的compile与link函数详解
Dec 06 #Javascript
angularjs的一些优化小技巧
Dec 06 #Javascript
JavaScript开发人员的10个关键习惯小结
Dec 05 #Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 #Javascript
node.js中实现同步操作的3种实现方法
Dec 05 #Javascript
You might like
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
jQuery常用数据处理方法小结
2015/02/20 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
react的hooks的用法详解
2020/10/12 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
销售自我评价
2013/10/22 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
数学教师个人工作总结
2015/02/06 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
教育教学工作反思
2016/02/24 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电