Числа Фибоначчи в INTERCAL
Используется итеративное определение чисел Фибоначчи. В переменных .11 и .12 хранятся предыдущее и текущее числа, в .9 — количество остающихся итераций.
Тело цикла довольно простое — напечатать число .11, скопировать .10 и .11 в .1 и .2, сложить их ((1009) NEXT
вызывает сложение из стандартной библиотеки и записывает сумму в .3) и обновить значения. Самая сложная часть программы — код, обеспечивающий циклическое поведение. Вот что он делает:
(3) NEXT
и (4) NEXT
обеспечивают переход на метку (4). Здесь счетчик цикла .9 уменьшается на 1 (вызов (1010)
). После этого .1 вычисляется побитовыми операциями и становится 1, если .9 содержит ненулевое значение, и 0 в противном случае, и затем увеличивается на 1. Наконец, RESUME .1
возвращает выполнение программы к одному из более ранних NEXT
. Если .1 равно 2, программа возвращается на два NEXT
назад и продолжает выполняться с DO (1) NEXT
, возвращаясь к началу тела цикла. Если же .1 равно 1, программа возвращается на один NEXT
назад, продолжает выполняться с PLEASE GIVE UP
и останавливается.
Вывод программы выглядит следующим образом:
I
I
II
III
V
VIII
XIII
XXI
XXXIV
LV
LXXXIX
CXLIV
CCXXXIII
CCCLXXVII
DCX
CMLXXXVII
DO .9 <- #16
DO .10 <- #0
DO .11 <- #1
(1) PLEASE READ OUT .11
DO .1 <- .10
DO .2 <- .11
PLEASE (1009) NEXT
DO .10 <- .11
DO .11 <- .3
DO (3) NEXT
DO (1) NEXT
(3) DO (4) NEXT
PLEASE GIVE UP
(4) DO .1 <- .9
DO .2 <- #1
PLEASE (1010) NEXT
DO .9 <- .3
DO .1 <- '.9~.9'~#1
PLEASE (1020) NEXT
DO RESUME .1
Комментарии
]]>blog comments powered by Disqus
]]>