Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Ile razy funkcja wywołuje samą siebie?

jolkajolka 24 Jan 2012 08:07 1287 5
  • #1
    jolkajolka
    Level 12  
    Mam do napisania program, który wyświetla pewne liczby (mechanizm podobny do liczb Fibonacciego) używając funkcji rekurencyjnej. Jednym z poleceń jest wyświetlenie na ekranie ile razy funkcja wywołuje samą siebie. Siedzę nad tym już trochę i muszę przyznać, że nie wiem jak to zrobić... bo jak już coś wymyśle, to ta liczba jest definitywnie zbyt duża. Wklejam program. Będę wdzięczna za pomoc:)

    PS.
    Myślałam o tym, żeby wstawić c++; przed ostatnim return i ustawieniu c=1 jako globalnej zmiennej, ale coś ten pomysł mi nie wychodzi...

    Code: c
    Log in, to see the code
  • #2
    Terminator
    Level 23  
    Globalnie
    Code: cpp
    Log in, to see the code

    W funkcji f
    Code: cpp
    Log in, to see the code

    W funkcji main
    Code: cpp
    Log in, to see the code

    Jeśli rozmiar int będzie za mały to zamień na unsigned long long.
  • #3
    jolkajolka
    Level 12  
    Terminator wrote:
    Globalnie
    Code: cpp
    Log in, to see the code

    W funkcji f
    Code: cpp
    Log in, to see the code

    W funkcji main
    Code: cpp
    Log in, to see the code

    Jeśli rozmiar int będzie za mały to zamień na unsigned long long.



    Ok, wydaje się logiczne, tak już próbowałam, ale przy zakresie a=6 b=10 wychodzi 257 wywołań funkcji, to coś chyba nie tak...
  • Helpful post
    #4
    Eagle
    Level 24  
    Quote:
    wychodzi 257 wywołań funkcji, to coś chyba nie tak...


    dlaczego ?

    przy pierwszym wywołaniu funkcji gdy a = 6 to :

    ___________________________6_______________________
    ____________4__________________________5___________
    ________2_______3_________________3__________4_____
    ______________2___1_____________2___1_____2_____3__
    ______________________________________________2___1


    daje 15 wywołań funkcji, gdzie n dla kolejnych iteracji rośnie n więc i drzewo wywołań będzie większe, uważam że problem jest w zrozumieniu jak to działa. Proponuję prześledź wykonywanie programu krokowo obserwując jak zmienia się n i ile_razy.
  • Helpful post
    #5
    beluosus
    Level 25  
    Terminator wrote:
    W funkcji f
    Code: cpp
    Log in, to see the code
    Nie mam pojęcia po co ta zmienna statyczna. Wystarczy inkrementować zmienną globalną. Chyba, że jako zabezpieczenie żeby nie zmieniać zmiennej globalnej, ale i to średnio skuteczne. Można też przekazać dodatkowy parametr, wskaźnik do zmiennej, która będzie przechowywać ilość wykonań funkcji.

    jolkajolka wrote:
    przy zakresie a=6 b=10 wychodzi 257 wywołań funkcji, to coś chyba nie tak...
    Jeśli masz wątpliwości to skorzystań z debugera i prześledź program linia po linii.

    Poza tym jest kilka błędów, trzeba dodać <stdlib.h> dla funkcji system(). Tablica nie może być zmiennej długości - trzeba dynamicznie zaalokować pamięć. Dodatkowo tablica ta była za mała o jeden element (n<=sub). Main musi zwracać typ int. W C90 nie można mieszać deklaracji (wszystkie muszą być na początku funkcji), ale mniejsza z tym :). Tutaj kod z naniesionymi poprawkami:
    Code: c
    Log in, to see the code

    Jednak liczenie ze zmienną globalną jest zdecydowanie lepszym rozwiązaniem (chciałem pokazać tylko inną możliwość).
  • #6
    jolkajolka
    Level 12  
    Dzięki za odpowiedzi:)
    Już wszystko zrozumiałam i jest ok, bo sprawdzałam dla mniejszych liczb.