好程式設計師web前端分享javascript列舉演算法

好程式設計師IT發表於2019-04-12

好程式設計師 web 前端分享 javascript 列舉演算法 題目:在 1 2 3 4 5 五個數中,我們隨機選取 3 個數。問有多少種取法?並且把每種取出數的方法列舉出來。

 

乍看這道題,其實感覺沒什麼難度。三個 for 迴圈不就解決問題了。

 

程式碼:

 

var arr=[1,2,3,4,5];

    for(var i=0;i<5;i++){

        for var j=0;j<5;j++ {

            for(var k=0;k<5;k++)

                if(arr[i]!=arr[j]!=arr[j]){

                    console.log(arr[i]+''+arr[j]+arr[k]);

                }

        }

    }

 

 

這樣子就可以列印出來每種遍歷的情況。是不是看起來很簡單。但是,如果我們需要解決這一類問題的話,此解法就感覺不足了。比如說:我們在十個數取出八個數求結果,一百個數取出八十個數求出結果。那麼,我們分別要迴圈 8 次和 80 次,那麼這肯定是不行的。那麼,怎麼辦呢?? 其實採用列舉就可以了。

 

程式碼:

 

var  number=[1,2,3,4,5];  // 我們操作的陣列

    var state=[];   // 記錄狀態的陣列

    var shu=[];    // 列舉出來答案得到的陣列。

    function dfs(step,n){   //n ,代表取幾個數出來。

        var flag=true;

            if(step==n){  // 判斷條件,判斷是否取出來了個數。

                    console.log(state.join(""));

                    shu.push(state.join(""));  // 把取出來的書方法陣列中

                    return 0; // 結束迴圈

            }

 

 

            for(var i=0;i<number.length;i++){ // 迴圈資料

                    for(var j=0;j<state.length;j++){  // 判斷時候取出來重複的數。

                        if(state[j]==number[i]){

                            flag=false;

                            break;

                        }

                    }

                    if(flag){

                            state.push(number[i]);  // 儲存當前環境

                            dfs(step+1,n);

                            state.pop(number[i]);  // 回退到上一層的環境

                    }

 

                    flag=true;

 

                }

        }

 

 

        dfs(0,4);

 

        console.log(shu.length);

 

 

其實最重要的程式碼就是上面

 

if(flag){

state.push(number[i]);  // 儲存當前環境

dfs(step+1,n);

state.pop(number[i]);  // 回退到上一層的環境

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2641191/,如需轉載,請註明出處,否則將追究法律責任。

相關文章