Funktionen höherer Ordnung
In der Mathematik Summe_{i=1,n} f(i) oder auch Produkt_{i=1,n} f(i)
Zum Beispiel die Lisp-Funktion summe
:
(define (summe f a b) (if (> a b) 0 (+ (f a) (summe f (+ a 1) b) ) ) ) (define (id x) x) (define (sqr x) (* x x)) (summe id 1 4) 10 (summe sqr 1 4) 30
Mit einem Interface und
public interface SummenFunktion { public double f(int i); }
public class Summation { double summe( SummenFunktion sf, int a, int b ) { double sum = 0.0; for (int i = a; i <= b; i++) sum += sf.f(i); return sum; } }
Summation UML Diagramm
public class Identitaet implements SummenFunktion { public double f(int i) { return (double) i; } } public class Quadrat implements SummenFunktion { public double f(int i) { double d = (double) i; return d*d; } }
public class SummenTest { public static void main(String[] args) { Screen out = new Screen(); Summation s = new Summation(); SummenFunktion sf = null; double sum = 0.0; sf = new Identitaet(); sum = s.summe( sf, 1, 4); out.println("Summe von 0 bis ? von f(i) = i ist " + sum); sf = new Quadrat(); sum = s.summe( sf, 1, 4); out.println("Summe von 0 bis ? von f(i) = i*i ist " + sum); } }
Zum Beispiel die Lisp-Funktion operation
:
(define (operation op init f a b) (if (> a b) init (op (f a) (operation op init f (+ a 1) b) ) ) ) (operation + 0 id 1 4) 10 (operation + 0 sqr 1 4) 30 (operation * 1 id 1 4) 24 (operation * 1 sqr 1 4) 576
public interface Operation { public double getInit(); public double operation( double x, double y); }
Operation UML Diagramm
public class OperSum implements Operation { public double getInit() { return 0.0; } public double operation( double x, double y) { return x + y; } }
public class OperMult implements Operation { public double getInit() { return 1.0; } public double operation( double x, double y) { return x * y; } }
public interface OperationFunktion { public double f(int i); }
public class GeneralOperation { Operation oper = null; public GeneralOperation( Operation op ) { oper = op; } public double applyoperation( OperationFunktion of, int a, int b ) { double res = oper.getInit(); for (int i = a; i <= b; i++) res = oper.operation( res, of.f(i)); return res; } }
public class OperationTest { public static void main(String[] args) { Screen out = new Screen(); OperationFunktion of = null; double erg = 0.0; Operation sum = new OperSum(); GeneralOperation summe = new GeneralOperation( sum ); of = new Identitaet(); erg = summe.applyoperation( of, 1, 4); out.println("Summe von 0 bis ? von f(i) = i ist " + erg); of = new Quadrat(); erg = summe.applyoperation( of, 1, 4); out.println("Summe von 0 bis ? von f(i) = i*i ist " + erg); Operation prod = new OperMult(); GeneralOperation product = new GeneralOperation( prod ); of = new Identitaet(); erg = product.applyoperation( of, 1, 4); out.println("Produkt von 0 bis ? von f(i) = i ist " + erg); of = new Quadrat(); erg = product.applyoperation( of, 1, 4); out.println("Produkt von 0 bis ? von f(i) = i*i ist " + erg); } }
© Universität Mannheim, Rechenzentrum, 2002-2005.
Heinz KredelLast modified: Mon Jan 23 23:29:38 CET 2006