ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Αναδρομή προγράμματα Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε.
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Πρόγραμμα F-1: Υπολογισμός n! με αναδρομή /* n paragontiko me xrhsh recursive functions */ #include <stdio.h> int npar( int n); int main( void ) { int k, n; scanf("%d", &n); k= npar( n ); printf("%d\n", k); int npar( int n) { int z; if (n==1) { z= 1; else { z= n*npar( n-1 ); return z;
Πρόγραμμα F-2: Συνδυασμοί na στοιχείων ανά n (1/2) /* Ypologismos syndiasmwn na stoixeivn ana n (anejarthta seiras), ncr( n, k) = n! / ( k! (n-k)! ) Version 2 (Updated: 19-12-2014) */ #include <stdio.h> void combine( int na, int n, int b[], int t, int L); void printcomb( int a[], int n); int ncr( int n, int k); int main( void ) { int a[6]; int n=6; int na=10; printf("syndiasmoi %d stoixeivn ana %d\n", na, n); printf("plhthos syndiasmwn %d\n", ncr( na, n)); combine( na, n, a, 1, 0); return 0; void printcomb( int a[], int n) { int i; for( i=0; i<n; i++) { printf("%3d", a[i]); printf("\n"); (συνέχεια)
Πρόγραμμα F-2: Συνδυασμοί na στοιχείων ανά n (2/2) int ncr( int n, int k) { int p, pk, i; p=1; for(i= n-k+1; i<=n; i++) { p= p * i; pk=1; for(i= 1; i<=k; i++) { pk= pk * i; return p/pk; void combine( int na, int n, int b[], int t, int L) { int i; for(i= t; i <= na-n+l+1; i++) { b[l]= i; if (L == n-1) { printcomb( b, n); else { combine( na, n, b, i+1, L+1);
Πρόγραμμα F-3: Ορίζουσα n x n (1/2) /* Ypologismos orizousas n x n, recursive functions Dokimh: 3 1 2-1 3 1 2 1 2 1 d=-10 */ #include <stdio.h> #include <math.h> float determinant(float matrix[20][20], int size); int main( void) { float a[20][20]; int i, j, n; float d; scanf("%d",&n); for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%f",&a[i][j]); d= determinant( a, n); printf("%f\n", d); (συνέχεια)
Πρόγραμμα F-3: Ορίζουσα n x n (2/2) /* synarthsh ypologismou orizousas size x size, recursive function */ float determinant(float matrix[20][20], int size) { float s=1, det=0, m_minor[20][20]; int i, j, m, n, c; if (size==1) { return (matrix[0][0]); else { det=0; for (c=0;c<size;c++) { m=0; for (i=0;i<size;i++) { if (i!= 0) { n=0; for (j=0;j<size;j++) { if (j!= c) { m_minor[m][n]=matrix[i][j]; n= n + 1; m= m + 1; det=det + s * (matrix[0][c] * determinant(m_minor,size-1)); s=-1 * s; return det;
Πρόγραμμα F-4: Εύρεση κλειστών διαδρομών σε γράφο (1/6) /* Find loops in graph Test data # branches: 7 list of branches: 0: 0 1 1: 1 2 2: 2 3 3: 3 4 4: 0 3 5: 0 4 6: 2 4 # nodes: 5 list of loops: 0: 0 1 2 3 0 1: 0 1 2 3 4 0 2: 0 1 2 4 0 3: 0 1 2 4 3 0 4: 0 3 2 1 0 5: 0 3 2 4 0 6: 0 3 4 0 7: 0 3 4 2 1 0 8: 0 4 2 1 0 9: 0 4 2 3 0 10: 0 4 3 0 11: 0 4 3 2 1 0 */
Πρόγραμμα F-4: Εύρεση κλειστών διαδρομών σε γράφο (2/6) #include <stdio.h> #include <math.h> typedef struct { int a; int b; TBranch; typedef struct { int p[40]; int pk; TLoop; int findnode( int a[], int n, int x) { int i; for(i=0; i<n; i++) { if(a[i]==x) { return i; return -1; void printarr( int a[], int n) { int i; for( i=0; i<n; i++) { printf("%3d", a[i]); printf("\n"); (συνέχεια)
Πρόγραμμα F-4: Εύρεση κλειστών διαδρομών σε γράφο (3/6) void printloop( TLoop a) { int i; for( i=0; i<a.pk; i++) { printf("%3d", a.p[i]); printf("\n"); void printbranches( TBranch a[], int nb) { int i; for( i=0; i<nb; i++) { printf("%3d: %3d %3d\n", i, a[i].a, a[i].b); (συνέχεια)
Πρόγραμμα F-4: Εύρεση κλειστών διαδρομών σε γράφο (4/6) void findpath( int n0, float a[][40], int n, int p[], int *pk, TLoop iloops[], int *ilk) { int i, jj; p[*pk]=n0; *pk=*pk+1; //printf("debug: new node %d, path ",n0); //printarr(p, *pk); for(i=0;i<n;i++) { if (a[n0][i]!= 0) { if (i==p[0]) { if (*pk>2) { //printf("debug: find loop "); printarr( p, *pk); for(jj=0;jj<*pk;jj++) iloops[*ilk].p[jj]=p[jj]; iloops[*ilk].p[jj+1]=p[0]; iloops[*ilk].pk=*pk+1; *ilk=*ilk+1; else { if (findnode( p, *pk, i) == -1 ) { findpath( i, a, n, p, pk, iloops, ilk); *pk= *pk - 1; (συνέχεια)
Πρόγραμμα F-4: Εύρεση κλειστών διαδρομών σε γράφο (5/6) int main(void) { TBranch a[40]; float netw[40][40]={0}; int p[40]; int pk; int i, nb, nn, maxn; TLoop iloops[100]; int ilk; //read graph printf("enter # branches: "); scanf("%d",&nb); for(i=0;i<nb;i++) { printf("enter branch %d:\n",i); scanf("%d",&a[i].a); scanf("%d",&a[i].b); printf("\n"); printf("processing..\n"); printf("# branches: %d\n", nb); printf("list of branches:\n"); printbranches( a, nb); maxn=0; for(i=0;i<nb;i++) { netw[a[i].a][a[i].b]= 1; netw[a[i].b][a[i].a]= 1; if (a[i].a > maxn) maxn=a[i].a; if (a[i].b > maxn) maxn=a[i].b; (συνέχεια)
Πρόγραμμα F-4: Εύρεση κλειστών διαδρομών σε γράφο (6/6) nn= maxn+1; printf("# nodes: %d\n", nn); ilk=0; pk=0; findpath( 0, netw, nn, p, &pk, iloops, &ilk); printf("list of loops:\n"); for(i=0;i<ilk;i++) { printf("%3d:",i); printloop( iloops[i]); return 0;
Τέλος Ενότητας