Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

4.4 Εμβέλεια μεταβλητων και αναδρόμη στην Java

Στην Java, οι μεταβλητές είναι προσβάσιμες μόνο μέσα στην περιοχή δημιουργίας τους. Αυτό αποκαλείται “scope” ή “εμβέλεια”.

Στην Java, υπάρχουν δύο επίπεδα εμβέλειας:

  1. Επίπεδο μεθόδου (local scope): Οι μεταβλητές που ορίζονται μέσα σε μια μέθοδο είναι ορατές μόνο μέσα σε αυτήν τη μέθοδο. Δεν μπορούν να προσπελαστούν από άλλες μεθόδους ή τμήματα κώδικα εκτός της μεθόδου αυτής.
  2. Επίπεδο κλάσης (class scope): Οι μεταβλητές που ορίζονται στο επίπεδο της κλάσης είναι ορατές σε ολόκληρη την κλάση. Μπορούν να προσπελαστούν από οποιαδήποτε μέθοδο ή τμήμα κώδικα βρίσκεται εντός της κλάσης.

Αυτά τα επίπεδα εμβέλειας καθορίζουν την ορατότητα και την προσβασιμότητα των μεταβλητών στην Java.

Παρακάτω είναι ένα παράδειγμα του επιπέδου μεθόδου:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Example {
public static void main(String[] args) {
// επίπεδο μεθόδου
int x = 10; // Δημιουργία μιας μεταβλητής x με τιμή 10
System.out.println(x); // Εκτύπωση της τιμής της μεταβλητής x (10)
}
}
public class Example { public static void main(String[] args) { // επίπεδο μεθόδου int x = 10; // Δημιουργία μιας μεταβλητής x με τιμή 10 System.out.println(x); // Εκτύπωση της τιμής της μεταβλητής x (10) } }
public class Example {
  public static void main(String[] args) {
    // επίπεδο μεθόδου
    int x = 10; // Δημιουργία μιας μεταβλητής x με τιμή 10
    System.out.println(x); // Εκτύπωση της τιμής της μεταβλητής x (10)
  }
}

Στο παραπάνω παράδειγμα, η μεταβλητή x έχει επίπεδο μεθόδου, καθώς ορίζεται μέσα στη μέθοδο main(). Η μεταβλητή x είναι προσβάσιμη μόνο μέσα στη μέθοδο main().

Ένα block of code αναφέρεται σε όλο τον κώδικα μεταξύ των αγκυλών {}.

Οι μεταβλητές που δηλώνονται μέσα σε block of code είναι προσβάσιμες μόνο από τον κώδικα μεταξύ των αγκυλών, ο οποίος ακολουθεί τη γραμμή στην οποία δηλώθηκε η μεταβλητή:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Example {
public static void main(String[] args) {
// επίπεδο μεθόδου
int x = 10;
if (x == 10) {
// block επίπεδου μεθόδου
int y = 20;
System.out.println(x + y); // 30
}
// System.out.println(y); // σφάλμα
}
}
public class Example { public static void main(String[] args) { // επίπεδο μεθόδου int x = 10; if (x == 10) { // block επίπεδου μεθόδου int y = 20; System.out.println(x + y); // 30 } // System.out.println(y); // σφάλμα } }
public class Example {
  public static void main(String[] args) {
    // επίπεδο μεθόδου
    int x = 10;
    if (x == 10) {
      // block επίπεδου μεθόδου
      int y = 20;
      System.out.println(x + y); // 30
    }
    // System.out.println(y); // σφάλμα
  }
}

Στο παραπάνω παράδειγμα, η μεταβλητή y έχει block scope, καθώς ορίζεται μέσα στο block εντολών της συνθήκης if. Η μεταβλητή y είναι προσβάσιμη μόνο μέσα στο block εντολών της συνθήκης if και δεν μπορεί να χρησιμοποιηθεί έξω από αυτό. Επίσης, προσέξτε ότι αν προσπαθήσετε να εκτυπώσετε την μεταβλητή y έξω από το block εντολών της συνθήκης if, θα λάβετε ένα σφάλμα στον μεταγλωττιστή (compiler error).

[adinserter block=”2″]

Η αναδρομή (recursion) αναφέρεται στην τεχνική κλήσης μιας συνάρτησης από το εσωτερικό της ίδιας της συνάρτησης. Αυτή η τεχνική επιτρέπει την επίλυση πολύπλοκων προβλημάτων διαχωρίζοντάς τα σε πιο απλά υποπροβλήματα που είναι πιο εύκολο να επιλυθούν.

Η αναδρομή μπορεί να είναι λίγο δύσκολη στην κατανόηση. Ο καλύτερος τρόπος για να καταλάβετε πώς λειτουργεί είναι να πειραματιστείτε με αυτήν.

Ένα παράδειγμα της αναδρομής είναι η υλοποίηση του αλγορίθμου του παραγοντικού με αναδρομή:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Example {
// Μέθοδος για τον υπολογισμό του παραγοντικού
public static int factorial(int n) {
if (n == 1) { // Αν ο αριθμός είναι 1
return 1; // Επιστρέφεται 1 (τερματική συνθήκη)
} else {
return n * factorial(n - 1); // Υπολογισμός του παραγοντικού αναδρομικά
}
}
public static void main(String[] args) {
int result = factorial(5); // Κλήση της μεθόδου factorial() με όρισμα 5
System.out.println(result); // Εκτύπωση του αποτελέσματος (120)
}
}
public class Example { // Μέθοδος για τον υπολογισμό του παραγοντικού public static int factorial(int n) { if (n == 1) { // Αν ο αριθμός είναι 1 return 1; // Επιστρέφεται 1 (τερματική συνθήκη) } else { return n * factorial(n - 1); // Υπολογισμός του παραγοντικού αναδρομικά } } public static void main(String[] args) { int result = factorial(5); // Κλήση της μεθόδου factorial() με όρισμα 5 System.out.println(result); // Εκτύπωση του αποτελέσματος (120) } }
public class Example {
  // Μέθοδος για τον υπολογισμό του παραγοντικού
  public static int factorial(int n) {
    if (n == 1) { // Αν ο αριθμός είναι 1
      return 1; // Επιστρέφεται 1 (τερματική συνθήκη)
    } else {
      return n * factorial(n - 1); // Υπολογισμός του παραγοντικού αναδρομικά
    }
  }

  public static void main(String[] args) {
    int result = factorial(5); // Κλήση της μεθόδου factorial() με όρισμα 5
    System.out.println(result); // Εκτύπωση του αποτελέσματος (120)
  }
}

Ο παραπάνω κώδικας υλοποιεί την υπολογιστική λειτουργία του παραγοντικού. Αρχικά, ορίζεται η κλάση “Example”. Μέσα σε αυτήν, υπάρχει η μέθοδος “factorial”, η οποία υπολογίζει το παραγοντικό ενός αριθμού.

Η μέθοδος “factorial” έχει ως παράμετρο έναν ακέραιο αριθμό “n”. Αρχικά, ελέγχεται εάν ο “n” έχει τιμή 1. Αν ναι, τότε επιστρέφεται 1, καθώς το παραγοντικό του 1 είναι 1. Αν ο “n” δεν είναι 1, τότε υπολογίζεται το παραγοντικό του “n” ως το γινόμενο του “n” με το παραγοντικό του “n-1”, δηλαδή “n * factorial(n – 1)”. Αυτή η διαδικασία επαναλαμβάνεται μέχρι να φτάσουμε στην τερματική συνθήκη (όταν ο “n” γίνει 1).

Στην κύρια μέθοδο “main”, καλείται η μέθοδος “factorial” με όρισμα τον αριθμό 5. Το αποτέλεσμα του παραγοντικού αποθηκεύεται στη μεταβλητή “result” και εκτυπώνεται στην οθόνη με τη χρήση της εντολής “System.out.println(result)”.

Έτσι, ο κώδικας υπολογίζει και εμφανίζει το παραγοντικό του αριθμού 5, το οποίο είναι 120.

Στην Java, η αναδρομή είναι μια τεχνική που συχνά χρησιμοποιείται για την επίλυση προβλημάτων όπως η αναζήτηση δέντρων και η διαδικασία ταξινόμησης, μεταξύ άλλων. Η αναδρομή επιτρέπει την εκτέλεση ενός κομματιού κώδικα που καλεί τον εαυτό του.

Ωστόσο, η αναδρομή πρέπει να χρησιμοποιείται με προσοχή, καθώς υπάρχει ο κίνδυνος ατέρμονων κλήσεων, όπου η αναδρομική συνάρτηση καλείται συνεχώς χωρίς να φτάνει σε μια βάση. Αυτό μπορεί να οδηγήσει σε ανεπιθύμητες επιπτώσεις, όπως την κατάρρευση του προγράμματος ή την ανεπαρκή χρήση πόρων του συστήματος.

Για τη σωστή λειτουργία της αναδρομής, πρέπει να διασφαλίζεται ότι υπάρχει μια βάση ή μια συνθήκη τερματισμού που θα επιτρέπει τη διακοπή των αναδρομικών κλήσεων. Αυτό μπορεί να επιτευχθεί με την κατάλληλη δομή ελέγχου, ώστε να μην επιτρέπεται η ατέρμονη εκτέλεση του κώδικα.

[adinserter block=”3″]

Είναι σημαντικό να είμαστε προσεκτικοί κατά τη χρήση αναδρομής και να εξασφαλίζουμε ότι η συνάρτηση αναδρομής έχει σωστά ορισμένη συμπεριφορά και τερματίζει μετά από έναν συγκεκριμένο αριθμό αναδρομικών κλήσεων.

Η προσθήκη δύο αριθμών είναι εύκολη, αλλά η προσθήκη μιας σειράς αριθμών είναι πιο περίπλοκη. Στο παρακάτω παράδειγμα, χρησιμοποιείται η αναδρομή για την προσθήκη μιας σειράς αριθμών διαιρώντας το πρόβλημα σε απλούστερες προσθέσεις δύο αριθμών:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Example {
// Μέθοδος που υπολογίζει το άθροισμα αριθμών από το start έως το end
public static int sum(int start, int end) {
if (end > start) {
// Αν το end είναι μεγαλύτερο από το start, τότε κάνουμε αναδρομική κλήση της μεθόδου sum
// για να υπολογίσουμε το άθροισμα των αριθμών από start έως end-1 και προσθέτουμε το end
return end + sum(start, end - 1);
} else {
// Αν το end δεν είναι μεγαλύτερο από το start, τότε επιστρέφουμε το start
return start;
}
}
public static void main(String[] args) {
// Καλούμε τη μέθοδο sum για τους αριθμούς 1 έως 5 και αποθηκεύουμε το αποτέλεσμα στη μεταβλητή result
int result = sum(1, 5);
// Εκτύπωση του αποτελέσματος στην οθόνη
System.out.println(result);
}
}
public class Example { // Μέθοδος που υπολογίζει το άθροισμα αριθμών από το start έως το end public static int sum(int start, int end) { if (end > start) { // Αν το end είναι μεγαλύτερο από το start, τότε κάνουμε αναδρομική κλήση της μεθόδου sum // για να υπολογίσουμε το άθροισμα των αριθμών από start έως end-1 και προσθέτουμε το end return end + sum(start, end - 1); } else { // Αν το end δεν είναι μεγαλύτερο από το start, τότε επιστρέφουμε το start return start; } } public static void main(String[] args) { // Καλούμε τη μέθοδο sum για τους αριθμούς 1 έως 5 και αποθηκεύουμε το αποτέλεσμα στη μεταβλητή result int result = sum(1, 5); // Εκτύπωση του αποτελέσματος στην οθόνη System.out.println(result); } }
public class Example {
  // Μέθοδος που υπολογίζει το άθροισμα αριθμών από το start έως το end
  public static int sum(int start, int end) {
    if (end > start) {
      // Αν το end είναι μεγαλύτερο από το start, τότε κάνουμε αναδρομική κλήση της μεθόδου sum
      // για να υπολογίσουμε το άθροισμα των αριθμών από start έως end-1 και προσθέτουμε το end
      return end + sum(start, end - 1);
    } else {
      // Αν το end δεν είναι μεγαλύτερο από το start, τότε επιστρέφουμε το start
      return start;
    }
  }

  public static void main(String[] args) {
    // Καλούμε τη μέθοδο sum για τους αριθμούς 1 έως 5 και αποθηκεύουμε το αποτέλεσμα στη μεταβλητή result
    int result = sum(1, 5);
    // Εκτύπωση του αποτελέσματος στην οθόνη
    System.out.println(result);
  }
}

Ο παραπάνω κώδικας υλοποιεί μια αναδρομική μέθοδο με όνομα sum, η οποία υπολογίζει το άθροισμα των ακεραίων αριθμών από έναν αρχικό αριθμό (start) έως έναν τελικό αριθμό (end). Η μέθοδος sum ελέγχει αν ο end είναι μεγαλύτερος από το start. Αν είναι, τότε γίνεται αναδρομική κλήση της μεθόδου sum, με το end να μειώνεται κατά 1 σε κάθε αναδρομική κλήση, και προστίθεται με το end. Αυτή η διαδικασία συνεχίζεται μέχρι να γίνει η αναδρομική κλήση με το end να είναι ίσο με το start. Στην περίπτωση αυτή, η μέθοδος επιστρέφει την τιμή του start.

Στην main μέθοδο, γίνεται κλήση της sum με τους αριθμούς 1 και 5. Το αποτέλεσμα της κλήσης αποθηκεύεται στη μεταβλητή result. Στη συνέχεια, εκτυπώνεται το result στην οθόνη μέσω της μεθόδου System.out.println().

Έτσι, ο κώδικας υπολογίζει το άθροισμα των αριθμών από το 1 έως το 5 και εμφανίζει το αποτέλεσμα (15) στην οθόνη.

Όπως και με τη χρήση επαναλήψεων (loops), οι αναδρομικές συναρτήσεις μπορούν να αντιμετωπίσουν το πρόβλημα της ατέρμονης αναδρομής. Η ατέρμονη αναδρομή συμβαίνει όταν η συνάρτηση καλεί τον εαυτό της επαναληπτικά χωρίς να υπάρχει μια συνθήκη για τερματισμό. Κάθε αναδρομική συνάρτηση θα πρέπει να περιέχει μια συνθήκη τερματισμού, η οποία είναι η συνθήκη όπου η συνάρτηση σταματά να καλεί τον εαυτό της. Στο παράδειγμα που προαναφέρθηκε, η συνθήκη τερματισμού είναι όταν η παράμετρος k γίνεται ίση με 0.

Για να κατανοήσουμε καλύτερα την έννοια, είναι χρήσιμο να εξετάσουμε διάφορα παραδείγματα. Στο συγκεκριμένο παράδειγμα, η συνάρτηση εκτελεί την πρόσθεση μιας σειράς αριθμών από ένα αρχικό σημείο έως ένα τελικό σημείο. Η συνθήκη τερματισμού για αυτήν την αναδρομική συνάρτηση είναι όταν το τελικό σημείο δεν είναι μεγαλύτερο από το αρχικό σημείο.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Example {
public static int sum(int start, int end) {
if (end > start) {
return end + sum(start, end - 1); // Αναδρομική κλήση της μεθόδου sum για τον υπολογισμό του αθροίσματος από το start έως το end
} else {
return start; // Βάση της αναδρομής, επιστρέφει την τιμή του start όταν end <= start
}
}
public static void main(String[] args) {
int result = sum(1, 5); // Κλήση της μεθόδου sum για τον υπολογισμό του αθροίσματος από 1 έως 5
System.out.println(result); // Εκτύπωση του αποτελέσματος (15) στην κονσόλα
}
}
public class Example { public static int sum(int start, int end) { if (end > start) { return end + sum(start, end - 1); // Αναδρομική κλήση της μεθόδου sum για τον υπολογισμό του αθροίσματος από το start έως το end } else { return start; // Βάση της αναδρομής, επιστρέφει την τιμή του start όταν end <= start } } public static void main(String[] args) { int result = sum(1, 5); // Κλήση της μεθόδου sum για τον υπολογισμό του αθροίσματος από 1 έως 5 System.out.println(result); // Εκτύπωση του αποτελέσματος (15) στην κονσόλα } }
public class Example {
  public static int sum(int start, int end) {
    if (end > start) {
      return end + sum(start, end - 1); // Αναδρομική κλήση της μεθόδου sum για τον υπολογισμό του αθροίσματος από το start έως το end
    } else {
      return start; // Βάση της αναδρομής, επιστρέφει την τιμή του start όταν end <= start
    }
  }

  public static void main(String[] args) {
    int result = sum(1, 5); // Κλήση της μεθόδου sum για τον υπολογισμό του αθροίσματος από 1 έως 5
    System.out.println(result); // Εκτύπωση του αποτελέσματος (15) στην κονσόλα
  }
}

Ο παραπάνω κώδικας υλοποιεί μια μέθοδο με όνομα sum η οποία υπολογίζει το άθροισμα των ακεραίων από έναν αρχικό αριθμό (start) έως έναν τελικό αριθμό (end) χρησιμοποιώντας αναδρομή.

Συγκεκριμένα, η μέθοδος sum ελέγχει αν ο end είναι μεγαλύτερος από το start. Αν αυτό ισχύει, τότε καλείται η ίδια η μέθοδος sum για να υπολογιστεί το άθροισμα των αριθμών από το start έως το end - 1, και το αποτέλεσμα αυτής της κλήσης προστίθεται στο end. Αυτή η διαδικασία επαναλαμβάνεται μέχρι το end να γίνει ίσο με το start, και τότε η μέθοδος επιστρέφει την τιμή του start.

Στην main μέθοδο, καλείται η sum με τις παραμέτρους 1 και 5 για να υπολογίσει το άθροισμα των αριθμών από 1 έως 5. Το αποτέλεσμα αποθηκεύεται στη μεταβλητή result και εκτυπώνεται στην κονσόλα. Στην περίπτωση αυτή, το αποτέλεσμα θα είναι 15.

13 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων