Lisp Praktikum 2

Page content

Praktikum 2

Aufgabe 1

(defun reduce-list (f init seq)
  (cond ((null seq) init)
    (t(funcall f (car seq) (reduce-list f init (cdr seq))))))
    
(reduce-list #'+ 0 '(1 2 3 4))
10

;; Filter a sequence by the function f
;;if f(list-entry) == true then add to list
(defun filter (f seq) 
  (cond ((null seq) nil)
        ((funcall f (car seq)) (cons (car seq) (filter f (cdr seq))))
         (t (filter f (cdr seq)))))

Aufgabe 2

Erstelle eine Funktion “Range”:

  • (range 5) => (0 1 2 3 4)
  • (range 3 6) => (3 4 5)
  • (range 2 10 2) => (2 4 6 8)
  • (range 6 2 -1) => (6 5 4 3)
(defun range (a &optional (b nil) (c 1))
  (cond ((null b)
          (funcall 'range 0 a c))
        (t (cond ((< (* a c) (* b c))    ;;mit c multiplizieren um Bedingung umzukehren wenn c negativ
          (cons a (funcall 'range (+ a c) b c)))
             (t nil)))))

Aufgabe 3

Fakultätsfunktion mit Hilfe der Range Funktion implementieren:

(defun factorial (n)
    (apply #'* (range 2 (+ n 1)))