La respuesta de jmite se aplica a si el programa alguna vez saldrá de un cálculo, solo porque es infinito, no llamaría al código después de que esté muerto.
Sin embargo, hay otro enfoque: un problema para el cual hay una respuesta pero se desconoce:
public void Demo()
{
if (Chess.Evaluate(new Chessboard(), int.MaxValue) != 0)
MessageBox.Show("Chess is unfair!");
else
MessageBox.Show("Chess is fair!");
}
public class chess
{
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
...
}
}
Esta rutina, sin duda, no contiene código muerto - la función devolverá una respuesta que ejecuta un camino, pero no el otro. ¡Buena suerte para encontrarlo! Mi memoria es que ninguna computadora teórica puede resolver esto dentro de la vida útil del universo.
Con más detalle:
La Evaluate()
función calcula qué lado gana un juego de ajedrez si ambos lados juegan perfectamente (con la máxima profundidad de búsqueda).
Los evaluadores de ajedrez normalmente miran hacia adelante en cada movimiento posible a una profundidad específica y luego intentan anotar el tablero en ese punto (a veces expandir ciertas ramas más lejos como mirar a la mitad de un intercambio o similar puede producir una percepción muy sesgada). son 17695 movimientos a medias, la búsqueda es exhaustiva, atravesará todos los juegos de ajedrez posibles. Dado que todos los juegos terminan, no hay problema en tratar de decidir qué tan buena es la posición de cada tablero (y, por lo tanto, no hay razón para mirar la lógica de evaluación del tablero, nunca se llamará), el resultado es una victoria, una pérdida o un empate. Si el resultado es un empate, el juego es justo, si el resultado no es un empate, es un juego injusto. Para expandirlo un poco obtenemos:
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
foreach (ChessMove Move in Board.GetPossibleMoves())
{
Chessboard NewBoard = Board.MakeMove(Move);
if (NewBoard.Checkmate()) return int.MaxValue;
if (NewBoard.Draw()) return 0;
if (SearchDepth == 0) return NewBoard.Score();
return -Evaluate(NewBoard, SearchDepth - 1);
}
}
Tenga en cuenta, además, que será prácticamente imposible para el compilador darse cuenta de que Chessboard.Score () es un código muerto. El conocimiento de las reglas del ajedrez nos permite a los humanos resolver esto, pero para saberlo, debes saber que MakeMove nunca puede aumentar el conteo de piezas y que Chessboard.Draw () volverá verdadero si el conteo de piezas permanece estático durante demasiado tiempo. .
Tenga en cuenta que la profundidad de búsqueda es en medio movimientos, no en movimientos completos. Esto es normal para este tipo de rutina de IA, ya que es una rutina O (x ^ n): agregar una capa de búsqueda más tiene un efecto importante sobre cuánto tiempo tarda en ejecutarse.