Факториал в A++
Первое выражение загружает библиотеку init
, содержащую основные конструкции языка (циклы, условные переходы, сравнения и т.д.). Все эти конструкции не входят в основу языка и определяются через примитивы; так, например, конструкция if
определяется следующим образом:
(define true (lambda (x y)
x))
(define false (lambda (x y)
y))
(define if (lambda (b t f)
(b t f)))
Второе выражение определяет факториал как рекурсивную функцию. Отметим, что стандарт языка определяет два вида чисел — обычные целые с привычными арифметическими действиями и “понятийные” zero, one, two, ..., ten
. Числа разных видов не перекодируются друг в друга и используются отдельно; в данном случае применяются обычные целые.
Третье выражение определяет основной цикл, и четвертое — вызывает его. Команда print
завершает вывод переводом строки, в результате вывод программы имеет следующий вид:
-->0
-->! =
-->1
-->1
-->! =
-->1
-->2
-->! =
-->2
-->3
-->! =
-->6
-->4
-->! =
-->24
-->5
-->! =
-->120
...
Значения факториалов вычисляются правильно до 12!, затем происходит переполнение, и последующие значения выводятся как -1.
(load "app/init.app")
(define factorial (lambda(n)
(if (equal n 0)
1
(* n (factorial (- n 1))))))
(define main
(lambda(n)
(while (not (equal n 17))
(lambda()
(print n)
(print "! = ")
(print (factorial n))
(define n (+ n 1))))))
(main 0)
Комментарии
]]>blog comments powered by Disqus
]]>