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 相关文章推荐
关于IE7 IE8弹出窗口顶上
Dec 22 Javascript
niceTitle 基于jquery的超链接提示插件
May 31 Javascript
javascript的内存管理详解
Aug 07 Javascript
一段非常简单的js判断浏览器的内核
Aug 17 Javascript
html的DOM中Event对象onblur事件用法实例
Jan 21 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
几种经典排序算法的JS实现方法
Mar 25 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
Apr 13 Javascript
基于vue-video-player自定义播放器的方法
Mar 21 Javascript
微信小程序实现弹出菜单功能
Jun 12 Javascript
JavaScript私有变量实例详解
Jan 24 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
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
php遍历CSV类实例
2015/04/14 PHP
php中file_exists函数使用详解
2015/05/08 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
详解python3百度指数抓取实例
2016/12/12 Python
python实现自动发送报警监控邮件
2018/06/21 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
python线性插值解析
2020/07/05 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
会计工作决心书
2014/03/11 职场文书
社区务虚会发言材料
2014/10/20 职场文书
2015年工程部工作总结
2015/04/30 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
MySQL分区表管理命令汇总
2022/03/21 MySQL