最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實(shí)現(xiàn)的一個(gè)計(jì)算數(shù)字步數(shù)的算法分享

 更新時(shí)間:2014年12月06日 11:02:50   投稿:junjie  
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的一個(gè)計(jì)算數(shù)字步數(shù)的算法分享,本文先是講解了算法描述與實(shí)現(xiàn)原理,然后給出實(shí)現(xiàn)代碼,需要的朋友可以參考下

這兩天看了下某位大神的github,知道他對(duì)算法比較感興趣,看了其中的一個(gè)計(jì)算數(shù)字的步數(shù)算法,感覺(jué)這個(gè)有點(diǎn)意思,所以就自己實(shí)現(xiàn)了一個(gè)。

算法描述與實(shí)現(xiàn)原理

給出一個(gè)整型數(shù)字,統(tǒng)計(jì)出有多少種走法可以到達(dá)目標(biāo),比如一個(gè)數(shù)字4,可以有下面幾種走法

復(fù)制代碼 代碼如下:

    [ 1, 3 ]
        [ 4 ]
    [ 1, 1, 2 ]
        [ 2, 2 ]
    [ 1, 1, 1, 1 ]

其實(shí)通過(guò)上面的組合可以得出下面的結(jié)論。

1.先列出所有項(xiàng)是1的組合
2.依次從左到右項(xiàng)為1的組合
3.遞歸上面的集合,找出項(xiàng)里1的索引,然后計(jì)算左起2項(xiàng)的值,結(jié)果遞歸此操作
4.排除1和2的情況

下面先提供三個(gè)工具函數(shù):

復(fù)制代碼 代碼如下:

// 計(jì)算數(shù)組內(nèi)的值
function calculate(arg){
    return eval(arg.join('+'));
}

// 輸出數(shù)組的值
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;
}

下面貼出算法的實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

function countSteps(n){
    var counts = 0,i,j = 0;
    var result = [];
    var newresult = [];
    var source = [];
    var temparg = [];
    // 生成項(xiàng)全為1的數(shù)組
    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){
                // 生成從左到右項(xiàng)為1遞增的數(shù)組
                // 1.. 11.. 111..
                Array.prototype.push.apply(temparg, source.slice(0, j));
                temparg.push(calculate(source.slice(j,n)));
                result.push(temparg.slice(0));
                // 遞歸數(shù)組里的內(nèi)容,直到項(xiàng)里沒(méi)有1為止
                combine(temparg.slice(0));
            }
        }
    }
    // 組合包含1的數(shù)組項(xiàng)
    // 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的時(shí)候比1要多一項(xiàng)
    if(n == 2){
        result.push([2]);
    }
    // 添加全為1的情況
    result.push(source);
    // 輸出所有步
    print(result);
    console.log('總共有:' + result.length + '種走法');
}

// 運(yùn)行
countSteps(4);

// 輸出下面內(nèi)容
/*
    [ 1, 3 ]
    [ 4 ]
    [ 1, 1, 2 ]
    [ 2, 2 ]
    [ 1, 1, 1, 1 ]
    總共有:5種走
*/

總結(jié)

這個(gè)算法其實(shí)可以應(yīng)用到某類游戲中去,當(dāng)兩個(gè)物體之前的距離一定的話,對(duì)所有的可能進(jìn)行業(yè)務(wù)處理,當(dāng)然也可以應(yīng)用到別的地方,雖然大部分前端工程師對(duì)算法的實(shí)踐比較少,不過(guò)它還是有存在的價(jià)值的,很多UI細(xì)節(jié)方面其實(shí)都運(yùn)用了算法,以后有空還會(huì)貼更多關(guān)于算法相關(guān)的文章,歡迎大家多提些寶貴意見(jiàn).

相關(guān)文章

  • JavaScript缺少insertAfter解決方案

    JavaScript缺少insertAfter解決方案

    這篇文章主要介紹了JavaScript缺少insertAfter解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 基于webpack.config.js 參數(shù)詳解

    基于webpack.config.js 參數(shù)詳解

    下面小編就為大家分享一篇基于webpack.config.js 參數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 通過(guò)封裝scroll.js 獲取滾動(dòng)條的值

    通過(guò)封裝scroll.js 獲取滾動(dòng)條的值

    本文通過(guò)實(shí)例代碼給大家介紹了通過(guò)封裝scroll.js 獲取滾動(dòng)條的值的相關(guān)知識(shí),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • 數(shù)據(jù)分析軟件之FineReport教程:[5]參數(shù)界面JS(全)

    數(shù)據(jù)分析軟件之FineReport教程:[5]參數(shù)界面JS(全)

    表格軟件FineReport在設(shè)計(jì)報(bào)表時(shí)經(jīng)常會(huì)用到,這篇文章主要介紹數(shù)據(jù)分析軟件之FineReport教程:[5]參數(shù)界面JS,需要的朋友可以參考下
    2015-08-08
  • 一文解析JavaScript模塊構(gòu)建的三種方式

    一文解析JavaScript模塊構(gòu)建的三種方式

    在現(xiàn)代Web開(kāi)發(fā)中,JavaScript庫(kù)的構(gòu)建和打包是一個(gè)至關(guān)重要的環(huán)節(jié),不同的構(gòu)建方式可以影響到庫(kù)的性能、可維護(hù)性和適用性,本文將深入剖析三種主要的JavaScript模塊構(gòu)建方式:CommonJS、ES模塊和AMD,我們將深入探討它們的工作原理、適用場(chǎng)景以及示例代碼
    2023-08-08
  • 基于d3.js/neovis.js/neod3.js實(shí)現(xiàn)鏈接neo4j圖形數(shù)據(jù)庫(kù)的圖像化顯示功能

    基于d3.js/neovis.js/neod3.js實(shí)現(xiàn)鏈接neo4j圖形數(shù)據(jù)庫(kù)的圖像化顯示功能

    neovis.js?由vis.js支持的圖形可視化以及來(lái)自Neo4j的數(shù)據(jù)。這篇文章主要介紹了基于d3.js/neovis.js/neod3.js實(shí)現(xiàn)鏈接neo4j圖形數(shù)據(jù)庫(kù)的圖像化顯示功能,需要的朋友可以參考下
    2022-02-02
  • JavaScript仿小米輪播圖效果

    JavaScript仿小米輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript仿小米輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • TypeScript中交叉類型和聯(lián)合類型的區(qū)別詳解

    TypeScript中交叉類型和聯(lián)合類型的區(qū)別詳解

    聯(lián)合類型(Union Types)和交叉類型(Intersection Types)是 TypeScript 中的兩種高級(jí)類型,它們都用于組合多個(gè)類型并生成新的類型,但它們兩者之間的用法不一樣,本文小編就給大家講講TypeScript中交叉類型和聯(lián)合類型的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • 微信小程序顯示下拉列表功能【附源碼下載】

    微信小程序顯示下拉列表功能【附源碼下載】

    這篇文章主要介紹了微信小程序顯示下拉列表功能,涉及微信小程序navigator組件導(dǎo)航及頁(yè)面加載相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2017-12-12
  • JavaScript開(kāi)發(fā)中需要搞懂的字符編碼總結(jié)

    JavaScript開(kāi)發(fā)中需要搞懂的字符編碼總結(jié)

    字符集就是字符的集合,字符編碼則代表字符集的實(shí)際編碼規(guī)則,是用于計(jì)算機(jī)解析字符的。本文為大家整理了JavaScript開(kāi)發(fā)中需要搞懂的字符編碼,希望對(duì)大家有所幫助
    2023-02-02

最新評(píng)論

泰来县| 达拉特旗| 西青区| 新泰市| 威信县| 兴业县| 卢龙县| 泰州市| 大足县| 甘肃省| 金塔县| 虎林市| 渝中区| 广平县| 河南省| 长汀县| 景宁| 韶山市| 交口县| 靖远县| 伊宁市| 文山县| 大化| 北宁市| 忻城县| 西乌珠穆沁旗| 密云县| 岳阳市| 信阳市| 屏边| 宜兰县| 江阴市| 淮滨县| 睢宁县| 丰台区| 商水县| 沾益县| 陆川县| 东乌珠穆沁旗| 象州县| 沅江市|