Способ мышления-Форт


Глава 4. Детализированная разработка/решение задачи - часть 27


Если мы поделим число на пять, частное будет нулем (логическая ложь) когда число меньше пяти и единицей (истина) если оно находится между 5 и 9. Мы можем использовать это как булевский флаг для определения того, нужна ли ПЯТЕРКА:

( n) 5 / IF ПЯТЕРКА THEN ...

Частное-флаг становится аргументом для IF.

Далее, остаток от деления на 5 всегда представляет собой число от 0 до 4, что означает возможность (кроме случая исключений) использования остатка непосредственно в качестве аргумента для единичек. Мы перепишем фразу в виде:

( n) 5 /MOD IF ПЯТЕРКА THEN ЕДИНИЧКИ

Возвращаясь к нашим исключениям, мы теперь отмечаем, что на 4 и на 9 можно проверить в единственном месте - а именно, если остаток равен 4. Очевидно, что мы можем сделать наше 5 /MOD вначале, после чего проверить на исключения. Что-то вроде:

: ЦИФРА ( n) 5 /MOD OVER 4 = IF особый случай ELSE IF ПЯТЕРКА THEN ЕДИНИЧКИ THEN ;

(Отметьте, что мы проделали OVER с остатком, поэтому не потеряли его при сравнении с 4.)

Выходит, что мы в конце концов `сделали` IF THEN двойного вложения. Однако это, кажется, правильно, поскольку такой IF THEN обслуживает особый случай. Другой же IF THEN - столь короткая фраза, как "IF ПЯТЕРКА THEN", вряд ли заслуживает того, чтобы делать под нее отдельное определение. Вы, впрочем, можете. (Но мы не будем.)

Давайте сфокусируемся на коде для особых случаев. Вот его алгоритм: "Если цифра - четыре, то напечатать ЕДИНИЧКУ и ПЯТЕРКУ. Для девятки дать ЕДИНИЧКУ и ДЕСЯТКУ".

Можно положить, что цифра обязательно будет либо той, либо другой, иначе мы бы это определение не исполняли. Вопрос в том, как узнать, которая?

Опять же, можно использовать остаток от деления на пять. Если он равен нулю, то цифра была четверкой; иначе - девяткой. Так что мы разыграем ту же партию и используем частное как булевский флаг. Напишем:

: ПОЧТИ ( частное ) IF ЕДИНИЧКА ДЕСЯТКА ELSE ЕДИНИЧКА ПЯТЕРКА THEN ;

При повторном взгляде отметим, что ЕДИНИЧКУ мы исполняем в любом случае.


Начало  Назад  Вперед