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 相关文章推荐
JAVASCRIPT 对象的创建与使用
Mar 09 Javascript
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
Oct 01 Javascript
jQuery 常见学习网站与参考书
Nov 09 Javascript
jquery nth-child()选择器的简单应用
Jul 10 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
javascript获取当前的时间戳的方法汇总
Jul 26 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
Sep 17 Javascript
基于jQuery实现简单人工智能聊天室
Feb 10 Javascript
jquery平滑滚动到顶部插件使用详解
May 08 jQuery
Angular8路由守卫原理和使用方法
Aug 29 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
Oct 30 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实现的农历算法实例
2015/08/11 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
node.js require() 源码解读
2015/12/13 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
python爬虫基本知识
2018/03/05 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
python实现图像拼接
2020/03/05 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
司法所长先进事迹
2014/06/02 职场文书
安全例会汇报材料
2014/08/23 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
公司员工体检通知
2015/04/21 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
Python 正则模块详情
2021/11/02 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
ant design vue的form表单取值方法
2022/06/01 Vue.js