• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Problem z rekurencją i czasem

Object Storage Arubacloud
0 głosów
652 wizyt
pytanie zadane 1 maja 2015 w C i C++ przez falauthy Stary wyjadacz (11,550 p.)
zamknięte 1 maja 2015 przez falauthy

Cześć,

Mam problem z kodem. Mam za zadanie wyliczyć czas zapisu przy pomocy iteracji i rekurencji. Przy iteracji normalnie działa, ale przy rekurencji wywala mi program. Mógłby ktoś naprowadzić mnie dlaczego dzieje się tak a nie inaczej?

#include <iostream>
#include <time.h>

using namespace std;

long int fib (int n)
{
    if (n == 1 || n == 2) return 1;
    else return fib(n - 1) + fib(n - 2);
}

clock_t start, stop;
double czas;
int ile;

int main()
{
    cout << "Czas zapisu iteracyjnie" << endl;
    cout << "Ile liczb ciagu Fibonacciego chcesz obliczyc: ";
    cin >> ile;

    //poczatek liczenia fib iteracyjnie
    int *tablica = new int [ile];
    tablica[0] = tablica[1] = 1;

    start = clock();

    for (int i = 2; i < ile; i++)
        tablica[i] = tablica[i - 1] + tablica[i - 2];
    stop = clock();
    czas = (double)(stop - start) / CLOCKS_PER_SEC;
    cout << "Czas iteracyjnie wynosi: " << czas << endl;

    delete [] tablica;

    cout << "Czas zapisu rekurencyjnie" << endl;
    start = clock();
    fib(ile);
    stop = clock();
    czas = (double)(stop - start) / CLOCKS_PER_SEC;
    cout << "Czas rekurencyjnie wynosi: " << czas;

    return 0;
}

 

komentarz zamknięcia: Problem rozwiązany.

2 odpowiedzi

0 głosów
odpowiedź 1 maja 2015 przez Buby Pasjonat (19,590 p.)

Wywala mi program?

Coś więcej? Crashuje? Być może nadpis zmiennej nie działa - spróbuj zakomentarzować część iteracyjną i powiedz, czy zadziałało. Jeśli tak, to stwórz zmienne start2, stop2 i po kłopocie...

komentarz 1 maja 2015 przez falauthy Stary wyjadacz (11,550 p.)

Normalnie w konsoli wpisuje wartosc ile, to dla iteracyjnego działa, a gdy ma przejść do rekurencji, to wyświetla pierwszego cout'a i pokazuje

Program przestał działać

U Pana Mirosława na jedynym z filmików obliczał czas ze wskaznikami i bez i miał użyte te same zmienne do liczenia czasu.

Po wykomentowaniu iteracyjnego, ten sam błąd.

komentarz 1 maja 2015 przez Buby Pasjonat (19,590 p.)
Czyli problemem prawdopodobnie jest sama rekurencja.
komentarz 1 maja 2015 przez falauthy Stary wyjadacz (11,550 p.)
Domyślam się.
komentarz 1 maja 2015 przez Buby Pasjonat (19,590 p.)

U mnie twój kod działa...

 

Czas zapisu iteracyjnie
Ile liczb ciagu Fibonacciego chcesz obliczyc: 30
Czas iteracyjnie wynosi: 0
Czas zapisu rekurencyjnie
Czas rekurencyjnie wynosi: 0.042

komentarz 1 maja 2015 przez falauthy Stary wyjadacz (11,550 p.)
Spróbuj np. dla 1000000 wyrazów.
komentarz 1 maja 2015 przez Buby Pasjonat (19,590 p.)

Spróbuj np. dla 1000000 wyrazów.

Kolego, narzut pamięci spowodowany tyloma wywołaniami rekurencji [w twoim przypadku * 2] może doprowadzić do przepełnienia stosu, a w efekcie crashu programu.

Narzut dobrze może zobrazować poniższy przykład - każde wywołanie rekurencji tworzy kopie zmiennej:

void Rekurencja( int Ktore_Wywolanie )
{
    if( Ktore_Wywolanie > 0 )
    {
        std::cout << "Wartosc liczby: " << Ktore_Wywolanie << ". Adres zmiennej w pamieci: " << &Ktore_Wywolanie << std::endl;
        Rekurencja( Ktore_Wywolanie - 1 );
    }

    std::cout << "Teraz wrocilem tutaj. Zmienna wynosi: " << Ktore_Wywolanie << ". A adres: " << &Ktore_Wywolanie << std::endl;
}

 

komentarz 1 maja 2015 przez falauthy Stary wyjadacz (11,550 p.)
Tak mi się zdawało, bo tak właśnie rekurencja działa, ale chciałem się upewnić. :)
0 głosów
odpowiedź 1 maja 2015 przez iwan9449 Pasjonat (20,810 p.)
Twój kod działa poprawnie, ale algorytm wyznaczania kolejnych liczb ciągu fibonacciego oparty na rekurencji jest bardzo niewydajny. Można to dobrze zaobserwować na przedziale liczb ok 40-48 :)
komentarz 1 maja 2015 przez falauthy Stary wyjadacz (11,550 p.)
Jest to zadanie domowe z odcinka 13 u Pana Mirosława. Pomyslałem, że zrobię to na ciągu fibonacciego, bo dość często męczą o to na rozmowach i warto to wiedzieć.
komentarz 1 maja 2015 przez iwan9449 Pasjonat (20,810 p.)
Algorytm na wyznaczanie liczb ciągu fibonacciego jak najbardzij warto znać, ale w tym przypadku znacznie wydajniejszy będzie algorytm iteracyjny ;)
komentarz 1 maja 2015 przez falauthy Stary wyjadacz (11,550 p.)
Tak, domyślam się, bo Pan Mirosłąw dość jasno wyjaśnił działanie rekurencji. :)

Podobne pytania

0 głosów
0 odpowiedzi 174 wizyt
pytanie zadane 16 listopada 2019 w C i C++ przez Mavimix Dyskutant (8,390 p.)
+3 głosów
1 odpowiedź 601 wizyt
pytanie zadane 23 października 2021 w C# przez Kamirez7 Nowicjusz (180 p.)
+1 głos
0 odpowiedzi 161 wizyt

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...