Вот почему динамически созданные элементы не реагируют на клики & 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>
Это потому, что вы не учли обратное отслеживание. Например, скажем, ваша 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)
Потому что в Python наборы не имеют определенного порядка. Возможно, вы захотите использовать списки вместо множеств.