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 相关文章推荐
使用IE6看老赵的博客 jQuery初探
Jan 17 Javascript
JavaScript 基础篇之运算符、语句(二)
Apr 07 Javascript
Javascript原型链和原型的一个误区
Oct 22 Javascript
JSON字符串和对象之间的转换详解
May 26 Javascript
简单谈谈json跨域
Mar 13 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
Dec 13 Javascript
jQuery.form.js的使用详解
Jun 14 jQuery
微信小程序组件之srcoll-view的详解
Oct 19 Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 Javascript
利用 JavaScript 实现并发控制的示例代码
Dec 31 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
JavaScript 密码强度判断代码
2009/09/05 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
Python求出0~100以内的所有素数
2018/01/23 Python
Linux下python3.7.0安装教程
2018/07/30 Python
Django model反向关联名称的方法
2018/12/15 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
董事长秘书岗位职责
2013/11/29 职场文书
店长助理岗位职责
2013/12/13 职场文书
英语国培研修感言
2014/02/13 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
大学军训的体会
2014/11/08 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
借条格式范本
2015/05/25 职场文书
车间班组长竞聘书
2015/09/15 职场文书
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
微信小程序实现轮播图指示器
2022/06/25 Javascript