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)))