Відповідь jmite стосується того, чи програма коли-небудь вийде з обчислення - тільки тому, що це нескінченно, я б не називав код після того, як він буде мертвим.
Однак є ще один підхід: проблема, на яку є відповідь, але вона невідома:
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)
{
...
}
}
Ця процедура , без сумніву , дійсно містить мертвий код - функція повертає відповідь , який виконує один шлях , але не інші. Вдало знайдіть це, хоча! Моя пам'ять - жоден теоретичний комп'ютер не може вирішити це протягом життя Всесвіту.
Більш детально:
У Evaluate()
функції обчислює , яка сторона виграє гри в шахи , якщо обидві сторони грають відмінно (з максимальною глибиною пошуку).
Шахові оцінювачі зазвичай дивляться вперед на кожен можливий хід деякої заданої глибини, а потім намагаються забити дошку в цій точці (іноді розширюючи певні гілки далі, як дивитись на півдорозі через обмін або подібне, може створити дуже хитке сприйняття.) Оскільки фактична максимальна глибина є 17695 напівхвилин пошук є вичерпним, він пройде кожну можливу шахову гру. Оскільки всі ігри закінчуються, немає жодних проблем намагатися вирішити, наскільки хороша позиція кожної дошки (і, отже, немає підстав дивитися на логіку оцінювання дошки - вона ніколи не буде називатися), результат - це виграш, програш або нічия. Якщо результат - нічия, гра справедлива, якщо результат - нічия, це несправедлива гра. Щоб трохи розширити його, ми отримуємо:
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);
}
}
Зауважте також, що компілятору буде практично неможливо зрозуміти, що Chessboard.Score () - це мертвий код. Знання правил шахів дозволяє людям розібратися в цьому, але щоб зрозуміти це, ви повинні знати, що MakeMove ніколи не може збільшити кількість штук і що Chessboard.Draw () повернеться справжнім, якщо кількість штук залишатиметься статичною занадто довго .
Зауважте, що глибина пошуку знаходиться в половині ходів, а не в цілому. Це нормально для такого роду рутинних методів AI, оскільки це O (x ^ n) рутина - додавання ще одного пошукового шару має великий вплив на те, скільки часу потрібно запустити.