Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Kamia eksigisi ??

Îåêßíçóå áðü ôï ìÝëïò dimcal. Τελευταία δημοσίευση από το μέλος dimcal στις 29-05-2010, 00:40. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-05-2010, 18:47 58861

    Kamia eksigisi ??

    Δοκιμάζω τον εξής κώδικα σε C :

    #include <stdio.h>

    void anadromi_void(int q)

    {
      printf("%d\n",q); 

         if (q==10)
            return ;
         else
           anadromi_void(q=q+1);

            printf("%d\n",q);

       
    }

    main()
    {
             anadromi_void(0);
     }

    και το αποτέλεσμα ειναι  :

    0 1 2 3  4 5 6 7 8 9 10 10 9 8 7 6  5 4 3 2 1   

    Η ερώτηση μου ειναι για ποιο λόγο αφού φτάσει στο 10 μετα μειώνει μεχρι το 1 χωρις να υπάρχει εντολή για να γινει αυτό ....

     

  •  28-05-2010, 19:07 58862 σε απάντηση της 58861

    Απ: Kamia eksigisi ??

    Πως δεν υπάρχει η εντολή; Μετά την εντολή anadromi_void(q=q+1) το printf(....) τι νομίζεις ότι κάνει; Σε αυτό οφείλεται το countdown. Στην αρχή χρησιμοποιείς ένα printf πριν το if. Εκεί έχεις από το 1 έως το 10. Μετά όμως το if έχεις βάλει πάλι printf αλλά αφού έχεις καλέσει ξανά την μέθοδο. Οπότε στο τέλος θα σου τρέξει όλα τα printf μετά την εντολή anadromi_void(q=q+1)

  •  28-05-2010, 19:14 58863 σε απάντηση της 58861

    Απ: Kamia eksigisi ??

    Η κλήση της anadromi_void(10) θα δώσει έξοδο
    10

    Η κλήση της anadromi_void(9) θα δώσει έξοδο
    9 (η έξοδος της anadromi_void(10)) 10 δηλαδή 9 10 10

    Η κλήση της anadromi_void(8) θα δώσει έξοδο
    8 (η έξοδος της anadromi_void(9)) 9 δηλαδή 8 9 10 10 9

    Η κλήση της anadromi_void(7) θα δώσει έξοδο
    7 (η έξοδος της anadromi_void(8) 8 δηλαδή 7 8 9 10 10 9 8

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





    Τάσος Καραγιάννης

    Baby debugging steps...
  •  28-05-2010, 23:54 58866 σε απάντηση της 58863

    Απ: Kamia eksigisi ??

    Μισο λεπτο βρε παιδια γιατι μπερδευτηκα λίγο . Το πρώτο printf θα ξεκινήσει απο το 0 μέχρι το 10 σωστα ? Δηλαδη αν βγάλω το δεύτερο printf θα εχει εξοδο :

    0 1 2 3 4 5 6 7 8 9 10

    Αφου το q ειναι πια 10 θα πρεπε να τυπώσει αλλη μια φορά το 10 στο 2o printf και μετα να τερματίσει την συναρτηση γιατι απο την στιγμή που q==10 δεν θα ξανακαλέσει την συνάρτηση ....

  •  29-05-2010, 00:07 58867 σε απάντηση της 58866

    Απ: Kamia eksigisi ??

    Λάθος.

    Όταν περνάς έναν ακέραιο ως int ουσιαστικά περνάς ένα αντίγραφο της τιμής του. Οι αλλαγές που γίνονται μέσα σε ένα function δεν φαίνονται έξω από αυτό. Έτσι το πρώτο printf θα τυπώσει την τιμή q, το δεύτερο την τιμή q+1. Έτσι η πρώτη κλήση θα τυπώσει 0 και 1, η δεύτερη 1 και 2, η τρίτη 2 και 3 κλπ. Εσύ μεν καλείς 10 φορές μόνο την συνάρτηση αλλά τυπώνεις 20 φορές. Το αποτέλεσμα είναι αυτό που περιγράφεις. Η πρώτη κλήση θα τυπώσει την πρώτη και την τελευταία τιμή (0 και 1), η δεύτερη τη δεύτερη και την 19η (1 και 2) κοκ. Σκέφου ότι κάνεις κάτι σαν το παρακάτω:

    0
    -1
    --2
    ---3
    ----4
    ----5
    ---4
    --3
    -2
    1

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  29-05-2010, 00:40 58868 σε απάντηση της 58867

    Απ: Kamia eksigisi ??

    A νομίζω το καταλαβα ! Δηλαδή το κομμάτι μέχρι την αναδρομική κλήση :

    anadromi_void (int q)

    {

       printf("%d",q);

       if (q==10)

          return;

       else

          anadromi_void(q=q+1);

     

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

     

     

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems