Προς το περιεχόμενο
  • Εγγραφή
  • 0

JAVA - Ερωτηση για την αναδρομη


BloodyJava

Ερώτηση

Καλησπερα σε ολους.

Εχω την παρακατω ερωτηση :

Έστω η ακόλουθη αναδρομική υπορουτίνα:

public static void recursive(int level) {

recursive(level--);

if (++level == 0) {

return;

}

}

Πόσες φορές θα καλέσει αναδρομικά η υπορουτίνα τον εαυτό της, αν καλέσουμε recursive(10);

ΠΙστευω πως η σωστη απαντηση ειναι πως προκειται περι ατερμονης αναδρομης καθοτι δεν υπαρχει ουσιαστικα base case. Το level υστερα απο καθε κληση γινεται μηδεν.

Πειτε μου plz εαν κανω λαθος και γιατι.

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

12 απαντήσεις σε αυτή την ερώτηση

Προτεινόμενες αναρτήσεις

  • 0
Δημοσ. (επεξεργασμένο)
1 ώρα πριν, BloodyJava είπε

Καλησπερα σε ολους.

Εχω την παρακατω ερωτηση :

Έστω η ακόλουθη αναδρομική υπορουτίνα:

public static void recursive(int level) {

recursive(level--);

if (++level == 0) {

return;

}

}

Πόσες φορές θα καλέσει αναδρομικά η υπορουτίνα τον εαυτό της, αν καλέσουμε recursive(10);

ΠΙστευω πως η σωστη απαντηση ειναι πως προκειται περι ατερμονης αναδρομης καθοτι δεν υπαρχει ουσιαστικα base case. Το level υστερα απο καθε κληση γινεται μηδεν.

Πειτε μου plz εαν κανω λαθος και γιατι.

Το έβαλες σε ένα IDE να το τρέξεις ?

Ατέρμονο είναι αλλά όχι επειδή γίνεται 0.

Όταν περνάει στην συνάρτηση το level-- σημαίνει ότι πρώτα θα τρέξει η συνάρτηση και μετά θα μειωθεί η τιμή του level κατά 1. Οπότε θα τρέχει για πάντα με 10 και δεν θα μειωθεί ποτέ.

Αν ήθελε να την μειώνει κατα ένα κάθε φορά που τρέχει θα έπρεπε να το πέρναγε έτσι : recursive(--level) .

Τώρα επειδή κάνει ακριβώς το ίδιο trick όταν κάνει τον έλεγχο if (++level == 0) αλλά πρώτα αλλάζει την τιμή του level και μετά κάνει τον έλεγχο ,ουσιαστικά ποτέ δεν θα καταλήξει το level να πάρει την τιμή 0.

Δηλαδή αν υποθέσουμε ότι καλούσε την recursive(--level) που είναι ο σωστός τρόπος αν θέλουμε να μειώσουμε την τιμή του level σε αυτή την ερώτηση , όταν θα έφτανε η στιγμή που το level θα έπαιρνε όντως την τιμή 0 , στο σημείο του ελέγχου που κάνει ++level==0 τότε η τιμή του level πρώτα θα γινόταν 1 και μετά θα έκανε έλεγχο για την ισότητα. Οπότε δεν θα πέρναγε πάλι ποτέ

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

Επεξ/σία από tsofras
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

Η συνάρτηση δεν θα τρέξει ποτέ, και θα βγάλει stack overflow exception, μιας και καλεί συνέχεια τον εαυτό της κανοντας τίποτα. Βαλε το call στην recursive μετά το if .

Επεξ/σία από Papakaliati
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
1 ώρα πριν, Papakaliati είπε

Βαλε το call στην recursive μετά το if .

Σωστά, αλλά και πάλι, μόνο με αρνητικές τιμές θα ολοκληρωθεί, αφού η if (++level == 0) μόνο με level ίσο με -1 ικανοποιείται. Με τιμές >-1, το level τείνει στο άπειρο, αφού, μετά την if, η συνάρτηση καλεί τον εαυτό της με προσαυξημένο το level κατά 1.

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
2 ώρες πριν, Papakaliati είπε

Η συνάρτηση δεν θα τρέξει ποτέ, και θα βγάλει stack overflow exception, μιας και καλεί συνέχεια τον εαυτό της κανοντας τίποτα. Βαλε το call στην recursive μετά το if .

Όντως stack overflow πετάει αλλά δεν ρώτησε ο ts τι να κάνει για να παίξει αλλά αν δουλεύει το πρόγραμμα για αυτό και του έδωσα αυτή την απάντηση

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)
Στις 13/3/2021 στις 11:40 ΜΜ, MastroGiannis είπε

Σωστά, αλλά και πάλι, μόνο με αρνητικές τιμές θα ολοκληρωθεί, αφού η if (++level == 0) μόνο με level ίσο με -1 ικανοποιείται. Με τιμές >-1, το level τείνει στο άπειρο, αφού, μετά την if, η συνάρτηση καλεί τον εαυτό της με προσαυξημένο το level κατά 1.

το (++level==0) δεν το ειχα προσεξει καν, τι φαση; Καμια λογικη. 

Επεξ/σία από Papakaliati
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
31 λεπτά πριν, Papakaliati είπε

το (++level==0) δεν το ειχα προσεξει καν, τι φαση; Καμια λογικη. 

Το θέμα είναι πως βλέπεις την ερώτηση :D

Σύμφωνα με την ερώτηση η απάντηση είναι άπειρες.

Αν η ερώτηση ήταν τι πρέπει να γίνει για να τρέξει σωστά , τότε όντως πρέπει να μπεί μέσα στην if και να αλλάξει ο τρόπος που αυξομειώνει την τιμή του ακέραιου

Δεν ξέρω τι έπινε αυτός που έγραψε την ερώτηση πάντως

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
5 ώρες πριν, albNik είπε

Το θεμα ειναι να καταλάβει ο φοιτητής οτι recursive(--level)  ειναι διαφορετικό απο recursive(level--)

Πως γίνεται να είναι αυτό το θέμα, αφού και τα δυο πετάνε stack overflow? 

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
13 ώρες πριν, Papakaliati είπε

Πως γίνεται να είναι αυτό το θέμα, αφού και τα δυο πετάνε stack overflow? 

Αυτο που ηθελα να πω απο ειναι οτι το 

recursive (level--); ειναι ισοδύναμο με recursive (level); level=level-1;  αρα η κάθε νέα θα καλείται με το ιδιο level=10

recursive (--level); ειναι ισοδύναμο με  level=level-1; recursive (level);  εδω το level  μειώνεται σε καθε κληση 

 

Βασικά δεν τερματίζει επειδή η συνθήκη τερματισμού ειναι μετά την κλήση την επόμενης recursive(). Το παρακατω εχει το if πριν και τερματίζει γραφοντας 10, 9 ,8,..0 . Aφαίρεσα το level++.

public static void recursive(int level)
{
    Console.WriteLine(level);
    if (level == 0)
    {
        return;
    }
    recursive(--level);
}

 

 

 

 

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.