В каком порядке участники А, В, С и D закончили соревнования?
Ознакомившись с задачей и проанализировав приведенные в ее условии сведения, нетрудно заметить, что, поскольку
прогнозы участников А и D эквивалентны, а верным оказался только один прогноз, прогнозы участников А и D неверны.
Следовательно, ни участник А, ни участник D не являются победителями соревнования. Теперь можно считать, что первый
шаг сделан. Для получения окончательного решения надо просто продолжить наши рассуждения. Поскольку прогноз участ-
ника А оказался неверным, значит, участник В также не стал победителем. Остается единственный возможный вариант, в
котором победителем стал участник С. Итак, участник С выиграл соревнования, и его прогноз оказался верным. Отсюда
можно сделать вывод, что участник А занял третье место. Это означает, что участники финишировали либо в порядке
CBAD, либо в порядке CDAB. Но первый вариант нужно отбросить, так как прогноз участника В не оправдался. Следова-
тельно, участники финишировали в порядке CDAB.
Конечно, сказать, что нужно сделать первый шаг и занять оптимальную позицию, – совсем не то же самое, что сказать,
как это сделать. Первоначальный прорыв, а затем осознание того, как закрепить полученный успех, чтобы суметь найти
окончательное решение задачи, потребуют значительных усилий от того, кто ее решает. Однако существует несколько об-
щих подходов, предложенных математиком Полиа и другими исследователями, подсказывающими, как можно осуществить
этот первоначальный прорыв. Один из подходов состоит в том, чтобы работать с задачей в обратном порядке. Например,
если задача заключается в том, чтобы найти способ получения определенного конечного результата из заданного начально-
го, можно начать поиск с конечного результата и попытаться пройти путь к заданному начальному. Этот подход будет поле-
зен, если потребуется найти алгоритм складывания бумажной птички, упомянутый в предыдущем разделе. Логично начать с
попытки развернуть сложенную птичку с целью понять, как она была сделана.
Другой общий подход к решению задачи состоит в поиске связанных с ней проблем, которые или легче решаются, или
уже были решены раньше. Позже предпринимается попытка применить способ их решения к данной задаче. Этот метод осо-
бенно важен в контексте разработки программ. Часто при разработке программы основная трудность заключается в создании
общего алгоритма для решения всех разновидностей данной задачи. Другими словами, если нам необходимо разработать
программу для упорядочения списка имен в алфавитном порядке, наша задача не сводится к сортировке отдельного списка, а
заключается в нахождении алгоритма, пригодного для сортировки любого списка имен. Рассмотрим следующий набор инст-
рукций.
Поменять местами имена David и Alice.
Поместить имя Carol между именами Alice и David.
Поместить имя Bob между именами Alice и Carol.
Этот набор позволяет правильно выполнить сортировку списка, состоящего из имен David, Alice, Carol и Bob, но он не
является тем общим алгоритмом, который мы ищем. Нам же нужен алгоритм, который в состоянии выполнить сортировку
как данного списка, так и любого другого, который может встретиться. Однако найденное решение сортировки конкретного
списка не является совершенно бесполезным для разработки общего алгоритма. Мы можем, например, продвинуться в ре-
шении, рассматривая такие частные случаи, как попытки найти oбщий принцип, которые, в свою очередь, послужат основой
для создания искомого общего алгоритма. В этом случае искомое решение, в конце концов, будет найдено с помощью мето-
да решения набора взаимосвязанных частных задач.
Еще один подход к проблеме "с чего начинать" заключается в применении метода поэтапного уточнения, который
предполагает, что задачу не следует пытаться решить сразу же и целиком во всех ее деталях. Согласно этому методу, иссле-
дователь должен разбить задачу на ряд подзадач. Идея заключается в том, что при разбиении исходной задачи на подзадачи
появляется возможность найти общее решение как последовательность этапов, на каждом из которых решается задача, более
простая по сравнению с исходной. Поэтапное уточнение подразумевает также, что каждый из этапов, в свою очередь, можно
разбить на меньшие, а те – на еще меньшие, так что, в конце концов, вся задача сводится к набору легко разрешимых подза-
дач.
Поэтапное уточнение является нисходящим методом, так как его развитие происходит в направлении от общего к част-
ному. В противоположность этому, восходящие методы предусматривают развитие от частного к общему. Хотя в теории эти
подходы противоположны, на практике они просто дополняют друг друга. Например, разбиение задачи, предлагаемое нис-
ходящим методом поэтапного уточнения, обычно осуществляется интуитивно с использованием восходящей модели.
Решениям, полученным с помощью метода поэтапного уточнения, свойственна естественная модульная структура.
Именно в этом кроется основная причина популярности этого метода при разработке алгоритмов. Если алгоритм имеет есте-
ственную модульную структуру, то он легко реализуется в модульном представлении, способствующем созданию удобных в
сопровождении программ. Более того, модульная структура, создаваемая в процессе поэтапного уточнения, легко совмеща-
ется с концепцией коллективного программирования, в соответствии с которой несколько человек объединяются в команду,
имеющую своей задачей разработку определенного программного продукта. После того как исходная задача будет разбита
на подзадачи (потенциальные модули), члены команды смогут работать над ними независимо, не мешая друг другу.
Метод поэтапного уточнения пользуется широкой популярностью при разработке программного обеспечения. Однако,
несмотря на все его преимущества, этот метод отнюдь не является последним словом науки в отношении создания алгорит-
мов. В сущности, он представляет собой только средство организации работы, и все его возможности по решению задач яв-
ляются лишь следствием этой организации. Вполне естественно использовать метод поэтапного уточнения при организации
общенациональной политической кампании, написании курсовой работы или заключении торгового соглашения. Аналогич-
ным образом для большинства проектов разработки программного обеспечения из области обработки данных характерна
большая роль организационного компонента. Задача этих проектов состоит не столько в создании нового сенсационного ал-
горитма, сколько в представлении решаемых задач таким образом, чтобы их можно было реализовать в виде согласованно
функционирующего пакета программ. Поэтому метод поэтапного уточнения по праву стал основой всей методологии проек-
тирования в области обработки данных.
Однако поэтапное уточнение остается всего лишь одной из многих методологий проектирования, представляющих интерес
для специалистов в области компьютерных наук. Поэтому не следует впадать в заблуждение, полагая, что все алгоритмы могут
быть созданы с помощью этого метода. Фактически применение при решении задач предвзятых представлений и заранее выбран-