好程序员web前端分享javascript枚举算法

本文通过具体案例,探讨了使用JavaScript实现枚举算法的有效方法。从简单的三重循环开始,逐步深入到更复杂的场景,如从十个数中取八个数,直至一百个数中取八十。文中详细解释了一种递归深度优先搜索算法,并通过代码示例展示了如何避免重复取数,最终实现了高效枚举所有可能的组合。

好程序员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]); //回退到上一层的环境
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值