<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.mafiasi.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=81.177.14.26</id>
	<title>Fachschaft Informatik - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mafiasi.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=81.177.14.26"/>
	<link rel="alternate" type="text/html" href="https://wiki.mafiasi.de/index.php/Spezial:Beitr%C3%A4ge/81.177.14.26"/>
	<updated>2026-10-18T02:08:32Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung10.txt&amp;diff=3200</id>
		<title>P1-WS04-MusterLoesung10.txt</title>
		<link rel="alternate" type="text/html" href="https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung10.txt&amp;diff=3200"/>
		<updated>2007-11-05T05:50:15Z</updated>

		<summary type="html">&lt;p&gt;81.177.14.26: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
	P1 Übungen WS2004/2005&lt;br /&gt;
	Musterlösung 10 (Martin Burmester)&lt;br /&gt;
&lt;br /&gt;
Aufgabe 1.)&lt;br /&gt;
&lt;br /&gt;
; (a)&lt;br /&gt;
&lt;br /&gt;
(define (ostersonntag j)&lt;br /&gt;
  (let*&lt;br /&gt;
  ; 1. Argument vom let*. Berechnen wir a,b,c,d,e,m,&lt;br /&gt;
      &lt;br /&gt;
  ((a (remainder j 19) )&lt;br /&gt;
   (b (remainder j 4)  )&lt;br /&gt;
   (c (remainder j 7)  )&lt;br /&gt;
   (m (cond ((&amp;lt;= 1800 j 1899)    23)&lt;br /&gt;
            ((&amp;lt;= 1900 j 2099)    24)&lt;br /&gt;
            ((&amp;lt;= 2100 j 2199)    24)&lt;br /&gt;
            (else                (error &amp;quot;year out of range!&amp;quot;))))&lt;br /&gt;
   (n (cond ((&amp;lt;= 1800 j 1899)    4)&lt;br /&gt;
            ((&amp;lt;= 1900 j 2099)    5)&lt;br /&gt;
            ((&amp;lt;= 2100 j 2199)    6)&lt;br /&gt;
            (else                (error &amp;quot;year out of range!&amp;quot;))))&lt;br /&gt;
   (d (remainder (+ (* 19 a) m)&lt;br /&gt;
                 30))&lt;br /&gt;
   (e (remainder (+ (* 2 b)&lt;br /&gt;
                    (* 4 c)&lt;br /&gt;
                    (* 6 d)&lt;br /&gt;
                    n)&lt;br /&gt;
                 7))&lt;br /&gt;
   (april_day0 (+ d e -9))&lt;br /&gt;
   (april_day (cond ((= april_day0 26)  19)&lt;br /&gt;
                    ((and (= april_day0 25)&lt;br /&gt;
                          (= d 28)&lt;br /&gt;
                          (= e 6)&lt;br /&gt;
                          (&amp;gt;= a 10))&lt;br /&gt;
                                        18)&lt;br /&gt;
                    (else               april_day0)))&lt;br /&gt;
   (march_day (+ 22 d e)))&lt;br /&gt;
&lt;br /&gt;
   ; 2. Argument vom let*. Nun haben wir alles!&lt;br /&gt;
   ;&lt;br /&gt;
   ; 1. Versuch:&lt;br /&gt;
   ; (list march_day &#039;maerz j &#039;oder april_day &#039;april j)&lt;br /&gt;
   ; bekommen wir komisches datum, z.B. (-8 april ...) oder (54 maerz ...)&lt;br /&gt;
   ;&lt;br /&gt;
   ; 2. Versuch&lt;br /&gt;
   ; kontrolliere ob april_day und march_day gültig sind...&lt;br /&gt;
        &lt;br /&gt;
   (if (&amp;gt; march_day 31) (list april_day &#039;April j)&lt;br /&gt;
                        (list march_day &#039;Maerz j))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; (b)&lt;br /&gt;
&lt;br /&gt;
;;&lt;br /&gt;
;; Jedem Monat ist die Anzahl der Tage im Monat und der&lt;br /&gt;
;; Folgemonat zugeordnet.&lt;br /&gt;
;;&lt;br /&gt;
(define maerz (cons 31 &#039;april))&lt;br /&gt;
(define april (cons 30 &#039;mai))&lt;br /&gt;
(define mai (cons 31 &#039;juni))&lt;br /&gt;
(define juni (cons 30 &#039;juli))&lt;br /&gt;
&lt;br /&gt;
(define tage-im-monat car)&lt;br /&gt;
(define folgemonat cdr)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;;&lt;br /&gt;
;; Fuegt zu einem Datum d eine Anzahl von&lt;br /&gt;
;; Tagen t hinzu und gibt ein gueltiges&lt;br /&gt;
;; Datum zurück&lt;br /&gt;
;;&lt;br /&gt;
(define (datum+tage d t)&lt;br /&gt;
  (define (korrigiere-datum d)&lt;br /&gt;
    (let ((tag   (car d))&lt;br /&gt;
          (monat (eval (cadr d)))&lt;br /&gt;
          (jahr  (caddr d)))&lt;br /&gt;
      (if (&amp;gt; tag (tage-im-monat monat))&lt;br /&gt;
          (korrigiere-datum (list (- tag (tage-im-monat monat))&lt;br /&gt;
                                  (folgemonat monat)&lt;br /&gt;
                                  jahr))&lt;br /&gt;
          d)))&lt;br /&gt;
  (korrigiere-datum (cons (+ (car d) t)&lt;br /&gt;
                          (cdr d))))&lt;br /&gt;
&lt;br /&gt;
(define (himmelfahrt j)&lt;br /&gt;
  (datum+tage (ostersonntag j) 39))&lt;br /&gt;
&lt;br /&gt;
; (c)&lt;br /&gt;
&lt;br /&gt;
(define (pfingsten j)&lt;br /&gt;
  (datum+tage (ostersonntag j) 49))&lt;br /&gt;
  &lt;br /&gt;
; Tes&lt;/div&gt;</summary>
		<author><name>81.177.14.26</name></author>
	</entry>
	<entry>
		<id>https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung12.txt&amp;diff=3184</id>
		<title>P1-WS04-MusterLoesung12.txt</title>
		<link rel="alternate" type="text/html" href="https://wiki.mafiasi.de/index.php?title=P1-WS04-MusterLoesung12.txt&amp;diff=3184"/>
		<updated>2006-12-12T20:42:07Z</updated>

		<summary type="html">&lt;p&gt;81.177.14.26: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
;;                                                 Musterloesung Aufgabenblatt 12&lt;br /&gt;
;;                                                                  P1 WiSe 04/05&lt;br /&gt;
;;                                                                  Henrich Pöhls&lt;br /&gt;
;;                                                             Daniel Schreckling&lt;br /&gt;
&lt;br /&gt;
;; In diesem Aufgabenblatt werden Funktionen aus der Datei tools.scm&lt;br /&gt;
;; verwendet. Deshalb wird sie an dieser Stelle eingebunden.&lt;br /&gt;
&lt;br /&gt;
(load &amp;quot;tools.scm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
;; Aufgabe 1&lt;br /&gt;
&lt;br /&gt;
;; 1 a) Funktionen höherer Ordnung sind Funktionen, deren &lt;br /&gt;
;; Argumente bzw. Funktionsparameter wiederum Funktionen darstellen&lt;br /&gt;
;; oder deren Rückgabewerte Funktionen sind.&lt;br /&gt;
&lt;br /&gt;
;; So muß z.B. &amp;quot;map&amp;quot; eine Funktion als Parameter haben und ist daher von&lt;br /&gt;
;; höherer Ordnung. Dagegen ist &amp;quot;eq&amp;quot; keine Funktion höherer Ordnung,&lt;br /&gt;
;; obwohl man den Aufruf &amp;quot;(eq + -)&amp;quot; ausführen kann (Ergebnis #f).&lt;br /&gt;
&lt;br /&gt;
;; 1 b)&lt;br /&gt;
&lt;br /&gt;
;; &amp;quot;map&amp;quot; ist eine Funktion höherer Ordnung, weil der erste Parameter eine&lt;br /&gt;
;; einstellige Funktion sein muß.&lt;br /&gt;
&lt;br /&gt;
;; &amp;quot;plus-oder-minus&amp;quot; ist eine Funktion höherer Ordnung, weil der&lt;br /&gt;
;; Rückgabewert immer - oder + ist.&lt;br /&gt;
&lt;br /&gt;
;; &amp;quot;pepper&amp;quot; ist eine Funktion höherer Ordnung, weil das erste Argument &amp;quot;f&amp;quot;&lt;br /&gt;
;; eine zweistellige Funktion sein muß.&lt;br /&gt;
&lt;br /&gt;
;; &amp;quot;my-tan&amp;quot; ist keine Funktion höherer Ordnung, weil sowohl das Argument&lt;br /&gt;
;; als auch der Rückgabewert Zahlen sein müssen.&lt;br /&gt;
&lt;br /&gt;
;; 1 c)&lt;br /&gt;
&lt;br /&gt;
;; Die globale Umgebung wird verwendet, um das Argument &amp;quot;3&amp;quot; des&lt;br /&gt;
;; Funktionsaufrufes zu reduzieren. (Da es eine Zahl ist, findet keine&lt;br /&gt;
;; Reduktion statt.) Der Wert des Symbols pepper wird ebenfalls in der&lt;br /&gt;
;; globalen Umgebung aufgelöst zu dem Lambda-Ausdruck&lt;br /&gt;
&lt;br /&gt;
;; (lambda (f arg1) (lambda (arg2) (f arg1 arg2)))&lt;br /&gt;
&lt;br /&gt;
;; Bei der Anwendung dieser anonymen Funktion auf + und 1 entsteht eine&lt;br /&gt;
;; neue Umgebung mit den Bindungen f = + und arg1 = 1. Nach der&lt;br /&gt;
;; Funktionanwendung entsteht also der Ausdruck&lt;br /&gt;
&lt;br /&gt;
;; (lambda (arg2) (+ 1 arg2))&lt;br /&gt;
&lt;br /&gt;
;; Erst bei der Anwendung dieser anonymen Funktion auf das ursprüngliche&lt;br /&gt;
;; Argument 3 entsteht eine weitere Umgebung, in der die Bindung arg2 = 3&lt;br /&gt;
;; gilt. Der Gesamtausdruck wird also reduziert zu&lt;br /&gt;
&lt;br /&gt;
;; (+ 1 3)&lt;br /&gt;
&lt;br /&gt;
;; und weiter zum Ergebnis 4.&lt;br /&gt;
&lt;br /&gt;
;; 1 d)&lt;br /&gt;
&lt;br /&gt;
;; (map (curry * 2) &#039;(1 2 3))&lt;br /&gt;
;;&lt;br /&gt;
;; Jedes Element der Liste wird mit zwei multipliziert.&lt;br /&gt;
;;&lt;br /&gt;
;; Ergebnis: (2 4 6)&lt;br /&gt;
&lt;br /&gt;
;; (map cons &#039;(1 2 3) &#039;(1 2 3))&lt;br /&gt;
;;&lt;br /&gt;
;; Aus den Elementen beider Listen werden jeweils paarweise und in der &lt;br /&gt;
;; entsprechenden Reihenfolge Paare gebildet. Hierfür wird der &lt;br /&gt;
;; &amp;quot;Paarkonstruktor&amp;quot; cons verwendet&lt;br /&gt;
;;&lt;br /&gt;
;; Ergebnis: ((1 . 1) (2 . 2) (3 . 3))&lt;br /&gt;
&lt;br /&gt;
;; (filter pair? &#039;((a b ) () 1 (())))&lt;br /&gt;
;;&lt;br /&gt;
;; filter pred list =&amp;gt; list&lt;br /&gt;
;;&lt;br /&gt;
;; Filtert genau die Elemente aus der übergebenen Liste, die das&lt;br /&gt;
;; Prädikat pred erfüllen. Hier bedeutet dies, dass genau die Elemente&lt;br /&gt;
;; herausgefiltert werden, die vom Typ pair sind.&lt;br /&gt;
;; &lt;br /&gt;
;; Da die leere Liste &#039;()&#039; und die Zahl &#039;1&#039; nicht vom Typ pair sind,&lt;br /&gt;
;; werden sie nicht in die Ergebnismenge übernommen.&lt;br /&gt;
;; &lt;br /&gt;
;; (()) ist im Unterschied zu () vom Typ pair?, da (()) eine abgekürzte &lt;br /&gt;
;; Schreibweise für ( () . () ) ist.&lt;br /&gt;
;;&lt;br /&gt;
;; Ergebnis: ((a b) (()))&lt;br /&gt;
&lt;br /&gt;
;; Aufgabe 2)&lt;br /&gt;
&lt;br /&gt;
;; Zum Testen unserer Funktionen verwenden &lt;br /&gt;
;; wir folgende Liste&lt;br /&gt;
&lt;br /&gt;
(define xs &#039;(1 -2 -3 4 5 6 -7 8 -9 10))&lt;br /&gt;
&lt;br /&gt;
;; 2 a)&lt;br /&gt;
&lt;br /&gt;
;; Verwende die Funktion reduce&lt;br /&gt;
&lt;br /&gt;
(reduce &lt;br /&gt;
 (lambda (x y)&lt;br /&gt;
   ;; Summiere die Absolutbeträge zweier Zahlen&lt;br /&gt;
   (+ (abs x) (abs y))&lt;br /&gt;
 ) ;; lambda&lt;br /&gt;
  xs 0&lt;br /&gt;
) ;; reduce&lt;br /&gt;
 &lt;br /&gt;
;; Eine zweite mögliche Lösung unter Verwendung einer &lt;br /&gt;
;; rekursiven Funktion wäre:&lt;br /&gt;
&lt;br /&gt;
;; Rekursionsabschluss: Sollte die Liste die &lt;br /&gt;
;; Länge null haben, so ist die Summe der &lt;br /&gt;
;; Absolutbeträge auch null&lt;br /&gt;
&lt;br /&gt;
;; Rekursionsschritt: Addiere zum Absolutbetrag&lt;br /&gt;
;; des ersten Elementes die Summe der Absolutbeträge&lt;br /&gt;
;; der Restliste&lt;br /&gt;
&lt;br /&gt;
(define (sum-abs xs)&lt;br /&gt;
  (cond ((null? xs) 0)&lt;br /&gt;
        (else (+ (abs(car xs))&lt;br /&gt;
                 (sum-abs (cdr xs))&lt;br /&gt;
              )&lt;br /&gt;
        )&lt;br /&gt;
  )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf unsere Beispielliste: 55&lt;br /&gt;
&lt;br /&gt;
;; 2 b)&lt;br /&gt;
&lt;br /&gt;
;; Verwende die Funktion Filter und selektiere alle &lt;br /&gt;
;; Elemente der Liste, die kleiner 0 sind&lt;br /&gt;
&lt;br /&gt;
(filter &lt;br /&gt;
  ;; #t, wenn x kleiner 0 ist, #f sonst&lt;br /&gt;
  (lambda (x) (&amp;lt; x 0))&lt;br /&gt;
  ;; die Liste&lt;br /&gt;
  xs&lt;br /&gt;
) ;; filter&lt;br /&gt;
&lt;br /&gt;
;; Verwendet man außerdem curry, so wird die &lt;br /&gt;
;; Lösung noch kürzer. Beachte: bei dieser &lt;br /&gt;
;; Lösung muss aufgrund der Argumentpositionen&lt;br /&gt;
;; &amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
(filter (curry &amp;gt; 0) xs)&lt;br /&gt;
&lt;br /&gt;
;; Alternative wäre:&lt;br /&gt;
&lt;br /&gt;
(filter (rcurry &amp;lt; 0) xs)&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf unsere Beispielliste:&lt;br /&gt;
;; (-2 -3 -7 -9)&lt;br /&gt;
&lt;br /&gt;
;; 2 c)  &lt;br /&gt;
&lt;br /&gt;
;; Zunächst werden alle Zahlen aus xs gefiltert, die ungerade sind,&lt;br /&gt;
;; also das Prädikat odd? erfüllen. Die Länge der resultierenden &lt;br /&gt;
;; Liste entspricht dann der Anzahl der ungeraden Zahlen in der Liste xs.&lt;br /&gt;
&lt;br /&gt;
(length (filter odd? xs))&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf unsere Beispielliste: 5&lt;br /&gt;
&lt;br /&gt;
;; 3)&lt;br /&gt;
&lt;br /&gt;
;; Hier wird ein Beispiellagerstand definiert&lt;br /&gt;
&lt;br /&gt;
(define *Lagerbestand*&lt;br /&gt;
  &#039;((Gummibaerchen . 100)&lt;br /&gt;
    (Lakritzschnecken . 30)&lt;br /&gt;
    (Wundertueten . 300)&lt;br /&gt;
    (Brausepulver . 1000)&lt;br /&gt;
    (Schokolade . 350)&lt;br /&gt;
    (Zahnpasta . 30)))&lt;br /&gt;
&lt;br /&gt;
;; 3 a)&lt;br /&gt;
&lt;br /&gt;
;; anzahl-von artikel =&amp;gt; Anzahl&lt;br /&gt;
&lt;br /&gt;
;; Bestimmt zum Namen eines Artikels die Anzahl&lt;br /&gt;
;; des Artikels, die im *Lagerbestand* aufgeführt&lt;br /&gt;
;; ist.&lt;br /&gt;
&lt;br /&gt;
(define (anzahl-von artikel)&lt;br /&gt;
  ;; hole den Wert zum ersten Element in der Liste&lt;br /&gt;
  (cdar&lt;br /&gt;
   ;; filtere genau die Elemente, deren Schlüssel&lt;br /&gt;
   ;; gleich dem Argument artikel ist&lt;br /&gt;
   (filter &lt;br /&gt;
    ;; #t, wenn der Schlüssel von x = artikel, #f sonst&lt;br /&gt;
    (lambda (x) (eqv? (car x) artikel)) &lt;br /&gt;
    *Lagerbestand*&lt;br /&gt;
   ) ;; filter&lt;br /&gt;
  ) ;; cdar&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
;; Verwendet man die Operation assq für assoziative&lt;br /&gt;
;; Listen, so erhält man folgende Lösung:&lt;br /&gt;
&lt;br /&gt;
(define (anzahl-von2 artikel)&lt;br /&gt;
  (cdr (assq artikel *Lagerbestand*)))&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf unseren Beispielbestand:&lt;br /&gt;
&lt;br /&gt;
;; &amp;gt; (anzahl-von &#039;Lakritzschnecken)&lt;br /&gt;
;; 30&lt;br /&gt;
;; &amp;gt; (anzahl-von2 &#039;Lakritzschnecken)&lt;br /&gt;
;; 30&lt;br /&gt;
&lt;br /&gt;
;; Hier wird natürlich davon ausgegangen, dass die&lt;br /&gt;
;; assoziative Liste konsistent ist und jeder Schlüssel &lt;br /&gt;
;; nur einmal vorkommt. Sollte dies nicht so sein, so &lt;br /&gt;
;; kann man zusätzlich über die Liste der Paare summieren&lt;br /&gt;
;; und man erhält folgende Lösung:&lt;br /&gt;
&lt;br /&gt;
(define (anzahl-von3 artikel)&lt;br /&gt;
  ;; summiere die Elemente der Liste&lt;br /&gt;
  (reduce + &lt;br /&gt;
          ;; Reduziere anhand von cdr die Elemente dieser&lt;br /&gt;
          ;; Liste (die Artikel) nur auf deren Anzahl&lt;br /&gt;
          (map cdr &lt;br /&gt;
               ;; Ermittle alle Elemente von *Lagerbestand2*&lt;br /&gt;
               ;; deren Schlüsselwert gleich dem Argument artikel ist&lt;br /&gt;
               (filter (lambda (x) (eqv? (car x) artikel)) *Lagerbestand2*)&lt;br /&gt;
          ) ;; map&lt;br /&gt;
  0) ;; reduce&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
;; mit folgendem nicht ganz konsistenten Lagerbestand&lt;br /&gt;
&lt;br /&gt;
(define *Lagerbestand2*&lt;br /&gt;
  &#039;((Gummibaerchen . 100)&lt;br /&gt;
    (Lakritzschnecken . 30)&lt;br /&gt;
    (Lakritzschnecken . 32)&lt;br /&gt;
    (Wundertueten . 300)&lt;br /&gt;
    (Brausepulver . 1000)&lt;br /&gt;
    (Schokolade . 350)&lt;br /&gt;
    (Zahnpasta . 30)))&lt;br /&gt;
&lt;br /&gt;
;; erhält man für&lt;br /&gt;
;; &amp;gt; (anzahl-von3 &#039;Lakritzschnecken)&lt;br /&gt;
;; 62&lt;br /&gt;
&lt;br /&gt;
;; 3 b)&lt;br /&gt;
&lt;br /&gt;
;; Definiere zunächst eine Hilfsfunktion, die&lt;br /&gt;
;; zu zwei Artikeln, den Artikel ermittelt, der &lt;br /&gt;
;; die kleinere Anzahl aufweist. Bei Gleichheit&lt;br /&gt;
;; wird der erste Artikel zurückgegeben&lt;br /&gt;
&lt;br /&gt;
(define (min_artikel x y)&lt;br /&gt;
  (cond ((&amp;lt;= (cdr x) (cdr y)) x)&lt;br /&gt;
         (else y)))&lt;br /&gt;
&lt;br /&gt;
;; Unter Verwendung von reduce wird zunächst der &lt;br /&gt;
;; Artikel in unserer assozativen Liste ermittelt,&lt;br /&gt;
;; der den kleinsten Wert hat. Die seed muss dem &lt;br /&gt;
;; ersten Element entsprechen. Abschließend wird &lt;br /&gt;
;; der Schlüssel des resultierenden Paars ermittelt,&lt;br /&gt;
;; in unserem Fall der Artikelname.&lt;br /&gt;
;; Falls in der Liste mehrere Artikel mit minimaler&lt;br /&gt;
;; Anzahl vorkommen, so wird nur der erste Artikel &lt;br /&gt;
;; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
(define (minimum alist)&lt;br /&gt;
  (car (reduce min_artikel alist (car alist))))&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf Beispielliste:&lt;br /&gt;
;; &amp;gt; (minimum *Lagerbestand*)&lt;br /&gt;
;; lakritzschnecken&lt;br /&gt;
&lt;br /&gt;
;; Zweite Lösungsmöglichkeit:&lt;br /&gt;
&lt;br /&gt;
;; Definiere eine Hilfsfunktion, die rekursiv den Artikel&lt;br /&gt;
;; ermittelt, der die geringste Menge aufweist.&lt;br /&gt;
&lt;br /&gt;
;; Rekursionsabbruch: Die Liste hat nur ein Element. Der&lt;br /&gt;
;; Artikel mit der kleinsten Anzahl ist genau das Element&lt;br /&gt;
;; dieser einelementigen Liste&lt;br /&gt;
&lt;br /&gt;
;; Rekursionsschritt: Der Artikel mit der geringsten Anzahl&lt;br /&gt;
;; an Elementen ist das Minimum aus dem Kopf und dem Minimum&lt;br /&gt;
;; der Restliste.&lt;br /&gt;
&lt;br /&gt;
(define minimum_kv&lt;br /&gt;
  (lambda (alist)&lt;br /&gt;
    (if (= (length alist) 1)&lt;br /&gt;
      (car alist)&lt;br /&gt;
      (if (&amp;lt;= (cdr (car alist)) (cdr (minimum_kv (cdr alist))))&lt;br /&gt;
        (car alist)&lt;br /&gt;
        (minimum_kv (cdr alist))&lt;br /&gt;
      )&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
(define (minimum2 alist)&lt;br /&gt;
  (car (minimum_kv alist)))&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf Beispielliste:&lt;br /&gt;
;; &amp;gt; (minimum2 *Lagerbestand*)&lt;br /&gt;
;; lakritzschnecken&lt;br /&gt;
&lt;br /&gt;
;; Dritte erweiterte Lösungsmöglichkeit:&lt;br /&gt;
&lt;br /&gt;
;; Problem: Obige Funktionen liefern nur EIN Minimum, d.h. falls &lt;br /&gt;
;; zwei oder mehr Artikel die minimale Anzahl aufweisen, wird nur &lt;br /&gt;
;; der erste Artikel angezeigt.&lt;br /&gt;
&lt;br /&gt;
;; minimum3 bestimmt zunächst das Minimum mit einer ähnlichen &lt;br /&gt;
;; Funktion, die in der ersten Lösungsmöglichkeit verwendet wurde &lt;br /&gt;
;; und filtert dann die Elemente aus der Liste, die genau diese&lt;br /&gt;
;; minimale Anzahl haben. Abschließend werden mit map die Namen&lt;br /&gt;
;; der Artikel extrahiert. Ergebnis ist eine Liste von Namen, die &lt;br /&gt;
;; Artikel bezeichnen, die eine minimale Anzahl aufweisen.&lt;br /&gt;
&lt;br /&gt;
(define (minimum3 alist)&lt;br /&gt;
  (let      &lt;br /&gt;
    ;; berechne zunächst die minimale Artikelanzahl,&lt;br /&gt;
    ;; die in a list zu finden ist&lt;br /&gt;
    ((mini (cdr (reduce min_artikel alist (car alist))))) &lt;br /&gt;
      ;; extrahiere die Namen der Artikel (schlüsselwerte)&lt;br /&gt;
      (map car&lt;br /&gt;
           ;; filtere die Artikel heraus, die die minimale &lt;br /&gt;
           ;; Anzahl aufweisen&lt;br /&gt;
           (filter&lt;br /&gt;
            ;; #t, wenn dieser Artikel auch die minimale Anzahl&lt;br /&gt;
            ;; aufweist&lt;br /&gt;
            (lambda (x) &lt;br /&gt;
              (= (cdr x) mini)&lt;br /&gt;
            ) ;; lambda &lt;br /&gt;
            alist&lt;br /&gt;
           ) ;; filter&lt;br /&gt;
      ) ;; map&lt;br /&gt;
  ) ;; let&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf unsere Beispielliste&lt;br /&gt;
;; &amp;gt; (minimum3 *Lagerbestand*)&lt;br /&gt;
;; (lakritzschnecken zahnpasta)&lt;br /&gt;
&lt;br /&gt;
;; 3 c)&lt;br /&gt;
&lt;br /&gt;
(define *sollbestand* 1000)&lt;br /&gt;
&lt;br /&gt;
;; nachbestellung artikel =&amp;gt; artikel&lt;br /&gt;
&lt;br /&gt;
;; Ermittelt zu einem Artikel die Anzahl der Einheiten,&lt;br /&gt;
;; die nachbestellt werden müssen, um den Vorrat auf&lt;br /&gt;
;; den Sollbestand zu erhöhen. Sind mehr Einheiten von&lt;br /&gt;
;; diesem Artikel vorhanden, so wird 0 ausgegeben.&lt;br /&gt;
&lt;br /&gt;
(define (nachbestellung artikel)&lt;br /&gt;
  (cons (car artikel) (if (&amp;lt; (cdr artikel) *sollbestand*) &lt;br /&gt;
                          (- *sollbestand* (cdr artikel))&lt;br /&gt;
                          0)))&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf Beispielliste:&lt;br /&gt;
&lt;br /&gt;
;; &amp;gt; (nachbestellung &#039;(Lakritzschnecken . 800))&lt;br /&gt;
;; (lakritzschnecken . 200)&lt;br /&gt;
  &lt;br /&gt;
;; 3 d)&lt;br /&gt;
&lt;br /&gt;
;; Generiert eine Liste, die die Anzahl an Einheiten enthält,&lt;br /&gt;
;; die für einen bestimmten Artikel nachbestellt werden müssen.&lt;br /&gt;
&lt;br /&gt;
(define (bestelliste bestand)&lt;br /&gt;
  (map nachbestellung bestand))&lt;br /&gt;
&lt;br /&gt;
;; Ergebnis bei Anwendung auf Beispielliste:&lt;br /&gt;
&lt;br /&gt;
;; &amp;gt; (bestelliste *Lagerbestand*)&lt;br /&gt;
;; ((gummibaerchen . 900)&lt;br /&gt;
;;  (lakritzschnecken . 970)&lt;br /&gt;
;;  (wundertueten . 700)&lt;br /&gt;
;;  (brausepulver . 0)&lt;br /&gt;
;;  (schokolade . 650)&lt;br /&gt;
;;  (zahnpasta . 970))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
297850591943426100394568&lt;/div&gt;</summary>
		<author><name>81.177.14.26</name></author>
	</entry>
</feed>