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 相关文章推荐
jQuery 标题的自动翻转实现代码
Oct 14 Javascript
JavaScript性能陷阱小结(附实例说明)
Dec 28 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
May 14 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
JS+CSS实现美化的下拉列表框效果
Aug 11 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
关于原生js中bind函数的简单实现
Aug 10 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
Nov 23 Javascript
jquery编写日期选择器
Mar 16 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
Jul 05 Javascript
使用PDF.js渲染canvas实现预览pdf的效果示例
Apr 17 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中ob_flush和flush的区别
2014/11/27 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
javascript的内存管理详解
2013/08/07 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
python文件操作之目录遍历实例分析
2015/05/20 Python
开始着手第一个Django项目
2015/07/15 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python实现自动发送报警监控邮件
2018/06/21 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
Python使用re模块验证危险字符
2020/05/21 Python
python suds访问webservice服务实现
2020/06/26 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
活动总结报告怎么写
2014/07/03 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
退货证明模板
2015/06/23 职场文书
学雷锋活动简报
2015/07/20 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
Python 中的Sympy详细使用
2021/08/07 Python
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL