Что, если у меня есть вложенные циклы, и я хочу убежать из всех них сразу?
while (true) {
// ...
while (shouldCont) {
// ...
while (shouldGo) {
// ...
if (timeToStop) {
break; // Break out of everything?
}
}
}
}
В PHP, break
берет аргумент в пользу количества циклов для убегания. Что-то вроде этого может быть сделано в C#?
Что относительно чего-то отвратительного, как goto
?
// In the innermost loop
goto BREAK
// ...
BREAK: break; break; break;
У вас есть график здесь, где все доступные шаги связаны (value=1), и недоступные шаги разъединены (value=0), редкая матрица была бы похожа:
(a1,b3)=1,
(a1,c2)=1,
.....
И кратчайший путь двух пунктов на графике может быть найден, используя http://Псевдокодекс en.wikipedia.org/wiki/Dijkstra's_algorithm
со страницы Википедии:
function Dijkstra(Graph, source):
for each vertex v in Graph: // Initializations
dist[v] := infinity // Unknown distance function from source to v
previous[v] := undefined // Previous node in optimal path from source
dist[source] := 0 // Distance from source to source
Q := the set of all nodes in Graph
// All nodes in the graph are unoptimized - thus are in Q
while Q is not empty: // The main loop
u := vertex in Q with smallest dist[]
if dist[u] = infinity:
break // all remaining vertices are inaccessible from source
remove u from Q
for each neighbor v of u: // where v has not yet been removed from Q.
alt := dist[u] + dist_between(u, v)
if alt < dist[v]: // Relax (u,v,a)
dist[v] := alt
previous[v] := u
return dist[]
ОТРЕДАКТИРУЙТЕ:
Введение в алгоритмы
ISBN 0-262-03384-4.
Или вы можете попробовать википедию, http://en.wikipedia.org/wiki/List_of_algorithms Goto только отвратительно, когда злоупотребляют. Чтобы выбыть из самого внутреннего цикла некоторых гнездовий, это приемлемо. НО... надо спросить, почему там в первую очередь так много гнездится.
Краткий ответ: Нет.
-121--924979-Извлеките вложенные циклы в функцию, а затем используйте возврат, чтобы выйти из цикла из любого места, а не разорвать.
Введите еще один контрольный флаг и поместите его во все ваши вложенные условия while, как показано ниже. Также заменяет имеющееся у вас условие while (true) на это
bool keepLooping = true;
while (keepLooping) {
// ...
while (shouldCont && keepLooping) {
// ...
while (shouldGo && keepLooping) {
// ...
if (timeToStop) {
keepLooping = false;
break; // break out of everything?
}
}
}
}
Гото ужасен только тогда, когда им злоупотребляют. Допускается выпадение из самого внутреннего цикла некоторой вложенности. НО ... нужно спросить, почему там вообще так много гнездовий.
Краткий ответ: Нет.