Функционално програмиране на Лисп (LISP)

Факториел в Lisp

Факториел от число на езика Лисп

(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

Няма коментари

Функции с координати в Лисп


Функция за проверка дали една точка с координати (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))))

Няма коментари

Основни функции в Лисп

За естествени числа:
функции за проверка на число дали е четно, нечетно, позитивно.
Функции за модул на число, факториел, сума от 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)

Сума на числата 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)

Няма коментари

  • Страница 2 от 2
  • <
  • 1
  • 2