Entwicklung rekursiver Prädikate Thema II: Kombinatorik A. Schächinger, M. Oswald, R. Banka, S. Krüger Aufgabe 1 Fakultät-Definition: Die Fakultät ist eine mathematische Kurzschreibweise für das Produkt der ersten n natürlichen Zahlen, und wird mit dem "!"-Zeichen abgekürzt. Für negative Zahlen ist die Fakultät nicht definiert. 0! = 1; (n+1)! = n!·(n+1) Fakultät Prolog fak(0,1). fak(X, Fakultaet):-X > 0, Y is X - 1, fak(Y,Z), Fakultaet is Z * X. Fibonacci-Definition: Die ersten beiden Zahlen sind als 1 festgelegt. Die folgenden Zahlen ergeben sich durch Summieren der beiden jeweils vorangehenden Zahlen. Bsp: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ... f(1) = 1 f(2) = 1 f(n+2) = f(n) + f(n+1) Fibonacci-Folge Prolog fib(1,1). fib(2,1). fib(N, F):-N > 1, N1 is N - 1, N2 is N - 2, fib(N1,F1), fib(N2,F2), F is F1 + F2,!. Aufgabe 4 variohne(N,K,V):-N>K, fak(N,K1), K2 is N-K, fak(K2,K3), V is K1//K3. varimit(_,0,1). varimit(N,K,E):-K1 is K-1, varimit(N,K1,E1), E is E1*N. kombiohne(_,0,1). kombiohne(N,N,1). kombiohne(N,K,Ko):-N1 is N-1, K1 is K-1, N>K, kombiohne(N1,K1,Ko1), kombiohne(N1,K,Ko2), Ko is Ko1+Ko2,!. kombimit(N,K,Ko):-N1 is N+K-1, kombiohne(N1,K,Ko). Aufgabe 3 Java Fakultät public class fakultaet { public int fak (int n) { if ( n==0 ) { return 1; } else { return n * fak(n-1); } }} Java Fibonacci public class fibonacci { public static long fib(int a){ if (a==1||a==2) return 1; else return fib(a-1)+fib(a-2); }} Vergleich Deklarativ Vergleich Imperativ Expliziete Festlegung > fak(0,1). public class fakultaet { public int fak (int n) < n wird initalisiert X muss über 0 > fak(X, Fakultaet):-X > 0, < wenn N = 0 Fakultät von Z > { Y ergibt sich > if ( n==0 ) { Fakultät wird berechnet return 1; < gebe 1 aus } else { return n * fak(n-1); }}} < Ausgabe der Faultät Y is X - 1, Fak(Y,Z), Fakultaet is Z * X.