Функционално програмиране на Лисп (LISP)
Факториел в Lisp
Публикувано от Ivelin Pavlov в Lisp Код, Код на 18 ноември 2012г.
Факториел от число на езика Лисп
(define (fact n) (define (fact_iter p i) (if (> i n) p (fact_iter (* p i) (+ i 1)))) (fact_iter 1 1)) ;izpolzvane (fact 5) ;vryshta 120
Функции с координати в Лисп
Публикувано от Ivelin Pavlov в Lisp Код, Код на 14 ноември 2012г.
Функция за проверка дали една точка с координати (X Y) е в един кръг с център (0,0) и радиус b, и извън кръг с център (0,0) и радиус a.
Първият начин е директно с една дефиниция:
(define (isIn? x y a b) (and (<= (+ (* x x) (* y y)) (* b b)) (> (+ (* x x) (* y y)) (* a a))))
Другия начин е с дефиниране дали една точка е в кръг и след това дефиниране на главната функция:
(define (inCircle? x y z) (<= (+ (* x x) (* y y)) (* z z))) (define (isIn? x y a b) (and (inCircle? x y b) (not (inCircle? x y a))))
Основни функции в Лисп
Публикувано от Ivelin Pavlov в Lisp Код, Код на 14 ноември 2012г.
За естествени числа:
функции за проверка на число дали е четно, нечетно, позитивно.
Функции за модул на число, факториел, сума от 1 до n и ред на Фибуначи.
(define (odd? x) (= (modulo x 2) 0)) (define (even? x) (= (modulo x 2) 1)) (define (positive? x) (> x 0)) (define (abs x) (cond ((> x 0) x) ((= x 0) 0) ((< x 0) (- 0 x)))) (define (fact n) (cond ((= n 0) 1) (else (* n (fact (- n 1)))))) (define (sum x) (if ((= x 1) 1) (+ x (sum (- n 1))))) (define (fib n) (cond ((= n 1) 1) ((= n 2) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))
Функция за число на степен
(define (pow a n) (if (even? n) (if (= n 0) 1 (* (pow a (/ n 2)) (pow a (/ n 2)))) (if (= n 1) a (* (pow a (- n 1)) a)))) (pow 2 5)
Уводни функции в Лисп (Lisp)
Публикувано от Ivelin Pavlov в Lisp Код, Код на 01 ноември 2012г.
Сума на числата 1,2,3,4
(+ 1 2 3 4)
връща: 10
Математическата функция (3*(2+6))/3
(/ (* 3 (+ 2 6)) 3)
връща: 8
Коментари в Lisp се поставят след точка със запетая
Пример:
;comment
Дефинира променлива a = 5
(define a 5)
Дефинира функция square, което връща квадрата на число:
(define (square x) (* x x))
Вика се: (square 5)
Връща: 25
Генератор за поредица от числа с действие accumulare:
Пример:
1*2*3*4*…*20 или 1+3+5+7+..+100
(define (accumulate start end init_value term_filter term combinator) (if (> start end) init_value (if (term_filter start) (combinator (term start) (accumulate (+ start 1) end init_value term_filter term combinator)) (accumulate (+ start 1) end init_value term_filter term combinator))))
Пример за използване:
always_true винаги ще връща истина
identity ще връща подадения параметър
square връща квадрата на променливата
f която връща сумата 4+16+36+…+n*n или 4+16+36+…+(n-1)*(n-1) (където n или n-1 е четно. Използва се „(f 10)“)
f2 която връща сумата 1+2+…+n (използва се „(f2 10)“)
nf ще връща 1*2*…*n (използва се „(nf 10)“)
functe връща (x^n)/(n!)
ex връща e^x или натуралното число e на степен x (използва се „(ex 2)“)
(define (always_true x) #t) (define (identity x) x) (define (square x) (* x x)) (define (f n) (accumulate 1 n 0 even? square +)) (define (f2 n) (accumulate 1 n 0 always_true identity +)) (define (nf n) (accumulate 1 n 1 always_true identity *)) (define (functe x n) (/ (expt x n) (nf n))) (define (ex x) (define (term n) (functe x n)) (accumulate 1 100 1 always_true term +)) (ex 2)