• js皇后棋算法生成器方法/传统递归两种方法


    function conflict(state, nextX) {
      let nextY = state.length;
      for (let i = 0; i < nextY; i++) {
        if ([0, nextY - i].indexOf(Math.abs(state[i] - nextX)) > -1) {
          return true;
        }
      }
      return false;
    }
    //------------------------------------生成器------------------------
    /**
     * 大致解析(错了勿喷):下面有两个yield,但是,当state的长度小于8时,yield都会被内部消化,只有最后一次[i.concat(res)]的时候才会被yield到外部
     */
    function* queens(num = 8, state = []) {
      for (let i = 0; i < num; i++) {
        if (!conflict(state, i)) {
          if (state.length == num - 1) {
            yield i;
          } else {
            for (let res of queens(num, state.concat([i]))) {
              yield [i].concat(res);
            }
          }
        }
      }
    }
    var a = queens();
    let num = 0;
    for (let j of a) {
      console.log(j);
      num++;
    }
    console.log(num);
    
    
    //------------------------------------------递归--------
    /**
     * 用递归和闭包重新写
     */
    function queens1(num = 8, state = []) {
      let all = [];
      function inner(num, state) {
        for (let i = 0; i < num; i++) {
          if (!conflict(state, i)) {
            let istate = state.concat([i]);
            if (istate.length == 8) {
              all.push(istate);
            } else {
              inner(num, istate);
            }
          }
        }
      }
      inner(num, state);
      return all;
    }
    
    console.log(queens1());

    生成器的方法是借鉴的python某大佬写的改来的,但是yield具体没有全部打印出来的原因没太搞懂

  • 相关阅读:
    SVN使用方法
    NHiberante3.2 调用存储过程之Errors in named queries:
    AjaxFileUpload + *.ashx 文件上传在IE8.0(XP,VS2010,Development Server)下的注意
    PB中设置SQLCA.AutoCommit = False的说明
    UrlRoutingModel摘要
    PB中的大数据量插入操作测试
    PB TreeView控件
    关于端口共用
    关于RealProxy
    EF无法更新错误
  • 原文地址:https://www.cnblogs.com/alecc1124/p/16044546.html
Copyright © 2020-2023  润新知