News
  Chat
  Forum
  Profile
  Links
  Stundenplan
  Speiseplan

  C++ Tutorials
  ASM Tutorials
  Scheme Tutorials
  HTML Tutorials

  Mathe Tips
  Physik Tips

  II02 Board
  II02 Members

  Member Projects
 Aufgabe18-11-02 
 

Descriptives Programmieren

Lösung:
(define derive+ (lambda (u v) (list '+ (derive u) (derive v)))) (define derive- (lambda (u v) (list '- (derive u) (derive v)))) (define derive* (lambda (u v) (list '+ (list '* (derive u) v) (list '* u (derive v))))) (define derive/ (lambda (u v) (list '/ (list '- (list '* (derive u) v) (list '* u (derive v))) (list '* v v)))) (define derivesin (lambda (x) (list '* (derive x) (list 'cos x)))) (define derivecos (lambda (x) (list '* (derive x) (list '* '-1 (list 'sin x))))) (define derive (lambda (ls) (if (list? ls) (cond ((null? ls ) '() ) ((eq? (car ls) '+) (derive+ (cadr ls) (caddr ls))) ((eq? (car ls) '-) (derive- (cadr ls) (caddr ls))) ((eq? (car ls) '*) (derive* (cadr ls) (caddr ls))) ((eq? (car ls) '/) (derive/ (cadr ls) (caddr ls))) ((eq? (car ls) 'sin) (derivesin (cadr ls))) ((eq? (car ls) 'cos) (derivecos (cadr ls))) ) (if (eq? ls 'x) '1 '0)))) Kommentar: Fangen wir bei der "derive" Function an: Als erstes testen wir ob unser ls eine Liste ist oder nicht. Wenn nicht haben wir etwas wie: (x) oder (39) wenn das der Fall ist, kommt die letzte If Anweisung dran. Hier wird geschaut ob eben dieses einzelne Element ein X oder eine Zahl ist. Abgeleitet ist X bekanntlich 1 und eine Zahl ist Abgeleitet 0. Nun zum komlizierteren Teil in der Mitte. Als erstes prüfen wir ob ls eine leere Liste ist - ist das der Fall geben wir einfach eine leere Liste zurück. Nun schauen wir ob wie unsere einzelne Klammer ausschaut - nach dem System: (* x 2) also immer ein *,+,-... und danach die zwei Operanden. Wir schauen nun welches Rechenzeichen vorliegt und rufen dann die passende Function mit den zwei Operanden auf. Die einzelnen Hilfsfunctionen werden nach den Gesetzen im Tafelwerk gebildet - z.B.: (+ 2 x) = Ableitung(2) + Ableitung(x) = (list '+ (derive u) (derive v)))) Bonus (Vereinfachung): (define simplify+- (lambda (x u v) (cond ((eq? u '0) (simplify v)) ((eq? v '0) (simplify u)) ((and (eq? x '-) (equal? u v)) '0) ((eq? u v) (list '* '2 (simplify u))) (else (list x (simplify u) (simplify v)))))) (define simplify* (lambda (u v) (cond ((eq? u '1) (simplify v)) ((eq? v '1) (simplify u)) ((eq? u '0) '0 ) ((eq? v '0) '0 ) (else (list '* (simplify u) (simplify v)))))) (define simplify (lambda (ls) (if (list? ls) (cond ((null? ls ) '() ) ((eq? (car ls) '+) (simplify+- '+ (cadr ls) (caddr ls))) ((eq? (car ls) '-) (simplify+- '- (cadr ls) (caddr ls))) ((eq? (car ls) '*) (simplify* (cadr ls) (caddr ls))) (else ls) ) ls ) )) (define simplifymax (lambda (ls) (if (equal? (simplify ls) ls) ls (simplifymax (simplify ls)))))