Úkol 3

Vyzkoušet si práci s jazykem LISP.

;faktorial (defun fact (n) (cond ((= n 1) 1) (t (* n (fact (- n 1)))))) ;---------------- ;fibonacci ; fib (0) = 0 ; fib (1) = 1 ; fib (n) = fib (n-1) + fib (n-2) (defun fib (n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) ;ackermanova fce ;m >= 0, n >= 0 ;ack(0, n) = n+1 ;ack(m, 0) = ack(m-1, 1) ;ack(m, n) = ack(m-1, ack(m, n-1)) (defun ack (m n) (cond ((zerop m) (1+ n)) ((zerop n) (ack (1- m) 1)) (t (ack (1- m) (ack m (1- n))))))
; spojeni seznamu (defun spoj (L1 L2) (cond ((NULL L1) L2) (T (cons (car L1) (spoj (cdr L1) L2))) ) ) ; vytvorte ;obraceni obecneho seznamu obratOb(seznam) (defun obratOb (S) (cond ((null S) nil) ((atom (car S)) (spoj (obratOb (cdr S)) (cons (car S) nil))) (T (spoj (obratOb (cdr S)) (cons (obratOb (car S)) nil))) ) ) ; test zda je prvek obsazen v obecnem seznamu jePrvekOb(seznam, prvek) (defun jePrvekOb (S P) (cond ((NULL S) nil) ((atom S) (= S P)) (t (or (jePrvekOb (car S) P) (jePrvekOb (cdr S) P)) ) ) ) ; prumer prvku obecneho seznamu prumerPrvkuOb(seznam) (defun prumerPrvkuOb (S) (cond ((null S) ()) (T (/ (soucetPrvkuOb S) (pocetPrvku S))) ) ) (defun pocetPrvku (S) (cond ((null S) 0) ((atom (car S)) (+ 1 (pocetPrvku(cdr S)))) (T (+ (pocetPrvku (car S)) (pocetPrvku (cdr S)))) ) ) ; soucet prvku obecneho seznamu soucetPrvkuOb(seznam) (defun soucetPrvkuOb (S) (cond ((null S) 0) ((atom (car S)) (+ (car S) (soucetPrvkuOb (cdr S)))) (T (+ (soucetPrvkuOb (car S)) (soucetPrvkuOb (cdr S)))) ) ) ; overeni monotonnosti linearniho seznamu monotonnostLin(seznam) ;monotonnostLin (defun monotonnostLin (S) (or (roste S) (klesa S)) ) (defun roste (S) (cond ((null S) T) ((null (cdr S)) T) (T (and (<= (car S) (car (cdr S))) (roste (cdr S)))) ) ) (defun klesa (S) (cond ((null S) T) ((null (cdr S)) T) (T (and (>= (car S) (car (cdr S))) (klesa (cdr S)))) ) )