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 相关文章推荐
使用firebug进行调试javascript的示例
Dec 16 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
Jan 27 Javascript
jquery中关于bind()方法的使用技巧分享
Mar 30 jQuery
Angular 2父子组件数据传递之@ViewChild获取子组件详解
Jul 04 Javascript
微信小程序-滚动消息通知的实例代码
Aug 03 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 Javascript
高性能的javascript之加载顺序与执行原理篇
Jan 14 Javascript
koa2实现登录注册功能的示例代码
Dec 03 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
python实现迭代法求方程组的根过程解析
Nov 25 Javascript
javascript实现异形滚动轮播
Nov 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
PHP版微信公众平台红包API
2015/04/02 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
原生JS轮播图插件
2017/02/09 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
详解Python如何获取列表(List)的中位数
2016/08/12 Python
快速了解Python相对导入
2018/01/12 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
建筑工程技术应届生求职信
2013/11/17 职场文书
七年级历史教学反思
2014/02/05 职场文书
中班幼儿评语大全
2014/04/30 职场文书
拾金不昧表扬信
2015/01/16 职场文书
北京爱情故事观后感
2015/06/12 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android