BloodyJava Δημοσ. 13 Μαρτίου 2021 Δημοσ. 13 Μαρτίου 2021 Καλησπερα σε ολους. Εχω την παρακατω ερωτηση : Έστω η ακόλουθη αναδρομική υπορουτίνα: public static void recursive(int level) { recursive(level--); if (++level == 0) { return; } } Πόσες φορές θα καλέσει αναδρομικά η υπορουτίνα τον εαυτό της, αν καλέσουμε recursive(10); ΠΙστευω πως η σωστη απαντηση ειναι πως προκειται περι ατερμονης αναδρομης καθοτι δεν υπαρχει ουσιαστικα base case. Το level υστερα απο καθε κληση γινεται μηδεν. Πειτε μου plz εαν κανω λαθος και γιατι.
tsofras Δημοσ. 13 Μαρτίου 2021 Δημοσ. 13 Μαρτίου 2021 (επεξεργασμένο) 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 και μετά θα έκανε έλεγχο για την ισότητα. Οπότε δεν θα πέρναγε πάλι ποτέ Λίγο παράξενη ερώτηση θα έλεγα δεν ξέρω αν κατάλαβες αυτό που σου είπα και ελπίζω ότι δεν έχω κάνει κάποιο λάθος γιατί αναδρομικές συναρτήσεις δεν έχω χρησιμοποιήσει σχεδόν ποτέ Επεξ/σία 13 Μαρτίου 2021 από tsofras
BloodyJava Δημοσ. 13 Μαρτίου 2021 Μέλος Δημοσ. 13 Μαρτίου 2021 Σορυ εννοούσα οτι ποτέ δεν γινεται μηδέν αλλα καταλαβα τι εννοείς. Ευχαριστω !
Papakaliati Δημοσ. 13 Μαρτίου 2021 Δημοσ. 13 Μαρτίου 2021 (επεξεργασμένο) Η συνάρτηση δεν θα τρέξει ποτέ, και θα βγάλει stack overflow exception, μιας και καλεί συνέχεια τον εαυτό της κανοντας τίποτα. Βαλε το call στην recursive μετά το if . Επεξ/σία 13 Μαρτίου 2021 από Papakaliati
MastroGiannis Δημοσ. 14 Μαρτίου 2021 Δημοσ. 14 Μαρτίου 2021 1 ώρα πριν, Papakaliati είπε Βαλε το call στην recursive μετά το if . Σωστά, αλλά και πάλι, μόνο με αρνητικές τιμές θα ολοκληρωθεί, αφού η if (++level == 0) μόνο με level ίσο με -1 ικανοποιείται. Με τιμές >-1, το level τείνει στο άπειρο, αφού, μετά την if, η συνάρτηση καλεί τον εαυτό της με προσαυξημένο το level κατά 1.
tsofras Δημοσ. 14 Μαρτίου 2021 Δημοσ. 14 Μαρτίου 2021 2 ώρες πριν, Papakaliati είπε Η συνάρτηση δεν θα τρέξει ποτέ, και θα βγάλει stack overflow exception, μιας και καλεί συνέχεια τον εαυτό της κανοντας τίποτα. Βαλε το call στην recursive μετά το if . Όντως stack overflow πετάει αλλά δεν ρώτησε ο ts τι να κάνει για να παίξει αλλά αν δουλεύει το πρόγραμμα για αυτό και του έδωσα αυτή την απάντηση
Papakaliati Δημοσ. 15 Μαρτίου 2021 Δημοσ. 15 Μαρτίου 2021 (επεξεργασμένο) Στις 13/3/2021 στις 11:40 ΜΜ, MastroGiannis είπε Σωστά, αλλά και πάλι, μόνο με αρνητικές τιμές θα ολοκληρωθεί, αφού η if (++level == 0) μόνο με level ίσο με -1 ικανοποιείται. Με τιμές >-1, το level τείνει στο άπειρο, αφού, μετά την if, η συνάρτηση καλεί τον εαυτό της με προσαυξημένο το level κατά 1. το (++level==0) δεν το ειχα προσεξει καν, τι φαση; Καμια λογικη. Επεξ/σία 15 Μαρτίου 2021 από Papakaliati
tsofras Δημοσ. 15 Μαρτίου 2021 Δημοσ. 15 Μαρτίου 2021 31 λεπτά πριν, Papakaliati είπε το (++level==0) δεν το ειχα προσεξει καν, τι φαση; Καμια λογικη. Το θέμα είναι πως βλέπεις την ερώτηση Σύμφωνα με την ερώτηση η απάντηση είναι άπειρες. Αν η ερώτηση ήταν τι πρέπει να γίνει για να τρέξει σωστά , τότε όντως πρέπει να μπεί μέσα στην if και να αλλάξει ο τρόπος που αυξομειώνει την τιμή του ακέραιου Δεν ξέρω τι έπινε αυτός που έγραψε την ερώτηση πάντως
MastroGiannis Δημοσ. 15 Μαρτίου 2021 Δημοσ. 15 Μαρτίου 2021 1 ώρα πριν, tsofras είπε Δεν ξέρω τι έπινε αυτός που έγραψε την ερώτηση πάντως Ό,τι κι αν ήταν, θα ήθελε να το πίνει ατέρμονα.
albNik Δημοσ. 16 Μαρτίου 2021 Δημοσ. 16 Μαρτίου 2021 Το θεμα ειναι να καταλάβει ο φοιτητής οτι recursive(--level) ειναι διαφορετικό απο recursive(level--) 1
Papakaliati Δημοσ. 16 Μαρτίου 2021 Δημοσ. 16 Μαρτίου 2021 5 ώρες πριν, albNik είπε Το θεμα ειναι να καταλάβει ο φοιτητής οτι recursive(--level) ειναι διαφορετικό απο recursive(level--) Πως γίνεται να είναι αυτό το θέμα, αφού και τα δυο πετάνε stack overflow?
albNik Δημοσ. 17 Μαρτίου 2021 Δημοσ. 17 Μαρτίου 2021 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); }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα