
148 " Гл. 2.
Основные
понятия
программирования
2.4.1.4.
Метод
родственных
задач
Как,
однако, прийти к паре
(iseven,
isodd)
рекурсивных под-
программ из
2.3.2?
Вместо того чтобы вкладывать
задачу
в бо-
лее общую, при использовании
метода
родственных
задач
к ней
„приставляют" одну или несколько задач таким образом, чтобы
подпрограммы из возникающей системы опирались
друг
на
друга.
Прежде всего
задачу
(с) из 2.3.2 можно сформулировать
словами так:
iseven
(m): «Установи, содержит ли данная последователь-
ность знаков m чётное число знаков.»
При
этом справедливо очевидное утверждение:
«Число знаков в последовательности четно
тогда
и толь-
ко
тогда,
когда все знаки
могут
быть сгруппированы в
пары.»
Если
теперь ввести родственную
задачу
isodd(m): «Установи, содержит ли данная последователь-
ность знаков m нечётное число знаков.»,
то обнаруживается взаимосвязь
двух
задач: непустая последо-
вательность знаков содержит нечётное число знаков в том и
только том случае, если после удаления одного знака она со-
держит чётное число знаков,— и чётное, если после удаления
одного знака остаётся нечётное число знаков. Далее, пустая
последовательность знаков тоже может сгруппироваться в
(пустое) множество пар и, следовательно, содержит чётное,
а стало быть, не нечётное, число пар. Мы приходим к таким
формулировкам:
iseven(m):
«Если последовательность m пуста, то: да.
В противном случае: Установи, содержит ли укороченная на
один
знак последовательность нечётное число знаков.»
isodd(m): «Если последовательность m пуста, то: нет.
В противном случае: Установи, содержит ли укороченная
на
один знак последовательность чётное число знаков.»
Из
этих словесных формулировок вытекают основанные на ба-
зовой операции
rest
из
2.1.3.4
формулировки, данные в 2.3.2(с).
Рассмотрим
сходную
задачу
'
ispos(m):
«Установи, четно ли число минусов в заданной
последовательности m знаков плюс и минус».
1
Ниже
pos—
от
positive
(положительный), neg — от
negative
(отрица-
тельный).
—
Прим.
изд. ред.