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 巧妙获取剪贴板数据 Excel数据的粘贴
Jul 09 Javascript
两个比较有用的Javascript工具函数代码
Feb 17 Javascript
Jquery 获取checkbox的checked问题
Nov 16 Javascript
关于JS字符串函数String.replace()
Apr 07 Javascript
Jquery给基本控件的取值、赋值示例
May 23 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
Jul 17 Javascript
Javascript监视变量变化的方法
Jun 09 Javascript
JavaScript中的this关键字使用详解
Aug 14 Javascript
JS控制FileUpload的上传文件类型实例代码
Oct 07 Javascript
JavaScript获取短信验证码(周期性)
Dec 29 Javascript
JavaScript实现简单音乐播放器
Apr 17 Javascript
layui的数据表格+springmvc实现搜索功能的例子
Sep 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
Terran历史背景
2020/03/14 星际争霸
php 删除数组元素
2009/01/16 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
面包屑导航详解
2017/12/07 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
Python脚本实现集群检测和管理功能
2015/03/06 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
营销与策划个人求职信
2013/09/22 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
2014年科研工作总结
2014/12/03 职场文书
起诉书格式范文
2015/05/20 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
高一作文之暖冬
2019/11/09 职场文书