js排列组合--递归枚举

题目:在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]);  //回退到上一层的环境
}

如果分析清楚,就没啥难度啦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容