递归搜索
image.png
image.png
image.png
image.png
image.png
image.png
image.png

  1. // 8皇后问题
  2. function queen (n, decisions = []) {
  3. if (decisions.length === n) {
  4. return [decisions]
  5. }
  6. let r = []
  7. const start = decisions[decisions.length - 1] || -1
  8. for (let i = start + 1; i < n * n; i++) {
  9. if (decisions.indexOf(i) === -1) {
  10. // 进一步优化,先判断x,y轴的都符合条件,在开启递归
  11. if (decisions.every(j => compatible(j, i, n))) {
  12. r = r.concat(queen(n, decisions.concat(i)))
  13. }
  14. }
  15. }
  16. return r
  17. }
  18. function compatible (p, q, n) {
  19. const [x1, y1] = [~~(p / n), p % n]
  20. const [x2, y2] = [~~(q / n), q % n]
  21. return x1 !== x2 && y1 !== y2 && Math.abs(x1 - x2) !== Math.abs(y1 - y2)
  22. }
  23. // function is_goal (n, decisions) {
  24. // for (let i = 0; i < n; i++) {
  25. // for (let j = i + 1; j < n; j++) {
  26. // if (i === j) { continue }
  27. // const p = decisions[i]
  28. // const q = decisions[j]
  29. // if (!compatible(p, q, n)) {
  30. // return false
  31. // }
  32. // }
  33. // }
  34. // return true
  35. // }
  36. console.log(queen(8));

深度遍历

深度遍历就是指,优先子集遍历,这样的话,就是栈结构,先入后出

image.png
image.png
image.png
image.png
image.png
image.png
也就是说程序的递归其实,就是栈调用的顺序,有时候就会报内存不足,栈溢出的错误

广度优先搜索

image.png
image.png
image.png
image.png
image.png