Почему выходные данные изменяются в этой реализации Python для Depth First Search?

Вот почему динамически созданные элементы не реагируют на клики & nbsp;:

var body = $("body");
var btns = $("button");
var btnB = $("<button>B</button>");
// `<button>B</button>` is not yet in the document.
// Thus, `$("button")` gives `[<button>A</button>]`.
// Only `<button>A</button>` gets a click listener.
btns.on("click", function () {
  console.log(this);
});
// Too late for `<button>B</button>`...
body.append(btnB);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

В качестве обходного пути вы должны прослушивать все клики и проверять исходный элемент & nbsp;:

var body = $("body");
var btnB = $("<button>B</button>");
var btnC = $("<button>C</button>");
// Listen to all clicks and
// check if the source element
// is a `<button></button>`.
body.on("click", function (ev) {
  if ($(ev.target).is("button")) {
    console.log(ev.target);
  }
});
// Now you can add any number
// of `<button></button>`.
body.append(btnB);
body.append(btnC);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

Это называется «Event Delegation». Хорошие новости, это встроенная функция в jQuery: -)

var i = 11;
var body = $("body");
body.on("click", "button", function () {
  var letter = (i++).toString(36).toUpperCase();
  body.append($("<button>" + letter + "</button>"));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

1
задан Recessive 28 March 2019 в 02:39
поделиться

2 ответа

Это потому, что вы не учли обратное отслеживание. Например, скажем, ваша DFS решает пойти [‘crocodiles’, ‘lasers’, ‘sharks’, ‘lava’, ‘piranhas’], что приводит к тупику. Теперь, несмотря на то, что он зашел в тупик, ‘lava’, ‘piranhas’ уже добавлено, поэтому, когда вы возвращаетесь к 'sharks' и правильно выбираете 'bees', список выводится неправильно.

Чтобы исправить эту проблему, вам просто нужно записать visited до создания пути от текущего узла. После создания пути проверьте, присутствует ли целевой узел, а если нет, установите visited обратно в исходное состояние:

def dfs(graph, current_vertex, target_value, visited=None):
  if visited is None:
    visited = []

  visited.append(current_vertex)

  if current_vertex == target_value:
    return visited


  for neighbor in graph[current_vertex]:
    if neighbor not in visited:
      orig = list(visited)
      path = dfs(graph, neighbor, target_value, visited)
      if path and target_value in path:
        return path
      visited = list(orig)

РЕДАКТИРОВАТЬ:

Также я должен отметить, для чего list(visited) и list(orig). Причиной этого является (в данном случае) глубокое копирование списков. Это означает, что изменение одного будет полностью независимым от другого. Это работает только для списков глубины 1 . Если список имеет глубину> 1, вы просто скопируете ссылку на списки внутри списка и столкнетесь с теми же проблемами. В этом случае используйте deepcopy из copy, импортируя его следующим образом:

from copy import deepcopy

Редактировать 2:

Лучше сделать это следующим образом Кстати, вам не нужно хранить копию списка:

def dfs(graph, current_vertex, target_value, visited=None):
  if visited is None:
    visited = []

  visited.append(current_vertex)

  if current_vertex == target_value:
    return visited


  for neighbor in graph[current_vertex]:
    if neighbor not in visited:
      path = dfs(graph, neighbor, target_value, visited)
      if path and target_value in path:
        return path
      visited.pop(-1)
0
ответ дан Recessive 28 March 2019 в 02:39
поделиться

Потому что в Python наборы не имеют определенного порядка. Возможно, вы захотите использовать списки вместо множеств.

0
ответ дан Juan Carlos 28 March 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: