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 相关文章推荐
索趣科技的答案
Feb 07 Javascript
JavaScript 题型问答有答案参考
Feb 17 Javascript
JavaScript全局函数使用简单说明
Mar 11 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
May 04 Javascript
FullCalendar日历插件应用之数据展现(一)
Dec 23 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
Dec 20 Javascript
微信小程序之圆形进度条实现思路
Feb 22 Javascript
jQuery实现基本淡入淡出效果的方法详解
Sep 05 jQuery
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 Javascript
微信小程序-可移动菜单的实现过程详解
Jun 24 Javascript
深入理解webpack process.env.NODE_ENV配置
Feb 23 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
Apr 20 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 &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
DEFER怎么用?
2006/07/01 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
微信小程序版本自动更新的方法
2019/06/14 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
python去除扩展名的实例讲解
2018/04/23 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
中文系学生自荐信范文
2013/11/13 职场文书
重阳节标语大全
2014/10/07 职场文书
5.12护士节活动总结
2015/02/10 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS