]]> ]]>

Числа Фибоначчи в INTERCAL

Пример для версий C-INTERCAL 28.0, J-INTERCAL 0.11, J-INTERCAL 0.12

Используется итеративное определение чисел Фибоначчи. В переменных .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

]]>

Работа программистам