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

Zadanie domowe z odcinka o rekurencjach

Object Storage Arubacloud
0 głosów
230 wizyt
pytanie zadane 7 lutego 2016 w C i C++ przez dartespl Użytkownik (830 p.)

Witam!

Zrobiłem zadanie domowe z odcinka rekurencjach (porównanie czasu rekurencji i iteracji liczenia silnii). Wydaje mi się, że zrobiłem wszystko poprawnie, ale kiedy włączam program to oba czasy są równe zero. Czy zrobiłem coś źle?

 

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

using namespace std;

clock_t start, stop;
double czas;
int ile;
long int wynikit=1;

long int silnia(int n)
{
    if (n==0) return 1;
    else return n*silnia(n-1);
}

int main()
{
    cin>>ile;
    start=clock();
    silnia(ile);
    stop=clock();
    czas=(double)(stop - start) / CLOCKS_PER_SEC;
    cout<<"Ile czasu (rekurencja): "<<czas<<" s"<<endl;

     start=clock();
    for(int i=1;i<=ile;i++)
    {
        wynikit=(wynikit)*i;
    }
    stop=clock();
    czas=(double)(stop - start) / CLOCKS_PER_SEC;
    cout<<"Ile czasu (iteracja): "<<czas<<" s"<<endl;


    return 0;
}

 

4 odpowiedzi

+3 głosów
odpowiedź 7 lutego 2016 przez MetGang Nałogowiec (34,360 p.)
clock() podaje czas w milisekundach. Dzisiejsze komputery są na tyle szybkie, że te twoje funkcje wykonują w czasie paru nanosekund. Wykonaj je milion razy w pętli, aby otrzymać jakiś znaczący/widoczny wynik.
komentarz 7 lutego 2016 przez dartespl Użytkownik (830 p.)
Tylko, że nie mogę podać więcej niż 60000 (wtedy pokazuje czas 0.0001 i 0), bo wtedy mi się program kraszuje.
komentarz 7 lutego 2016 przez MetGang Nałogowiec (34,360 p.)

No z powodu iż jest to funkcja rekurencyjna - istnieje szansa na stack overflow. Chociaż powinno się to dziać przy dużej ilości odwołań rekurencji, a nie ilości wywołań podstawowej funkcji. Tak czy inaczej różnica między tymi funkcjami jest naprawdę niewielka. I taka dygresja. Rozmiar long int na większości obecnych kompilatorów równa się int. Jeśli chcesz większe liczby to użyj 64-bitowego long long.

0 głosów
odpowiedź 7 lutego 2016 przez Jonki Dyskutant (8,180 p.)
Może program tak szybko liczy, że czas jest bardzo bliski zeru i dlatego go nie wyświetla.
komentarz 7 lutego 2016 przez niezalogowany
Nie, zmienna oznaczająca czas jest typu double przez co nawet bardzo małe liczby są wyświetlane(ale w notacji wykładniczej). Mi wyświetla wszystko normalnie
0 głosów
odpowiedź 7 lutego 2016 przez obl Maniak (51,280 p.)

Zrób to tak:

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

#define L_POWT 1000000
 
using namespace std;
 
clock_t start, stop;
double czas;
int ile;
long int wynikit=1;
 
long int silnia(int n)
{
    if (n==0) return 1;
    else return n*silnia(n-1);
}
 
int main()
{
	cout<<"Podaj liczbę, której silnia ma być obliczona:";
    cin>>ile;
    start=clock();
    for(int i=1; i <= L_POWT; i++){
    	silnia(ile);
    }
    stop=clock();
    czas=stop - start;
    cout<<"Ile czasu (rekurencja): "<<czas / CLOCKS_PER_SEC<<" s"<<endl;
 
    start=clock();
    for(int i=1;i<=L_POWT;i++)
    {
        for(int i=1;i<=ile;i++)
	    {
	        wynikit=wynikit*i;
	    }
    }
    stop=clock();
    czas=stop - start;
    cout<<"Ile czasu (iteracja): "<<czas / CLOCKS_PER_SEC<<" s"<<endl;
 
    return 0;
}

Mi wyszło dla 10! metodą rekurencyjną 0,062 s, a interacyjną 0,047 s

komentarz 7 lutego 2016 przez niezalogowany
Czemu używasz preprocesora do tworzenia stałych. Piszesz w C++ więc używaj const
komentarz 7 lutego 2016 przez obl Maniak (51,280 p.)
Wolę wstawić literał w miejscu jego użycia niż skakać w pamięci do stałej zadeklarowanej gdzieś w pamięci.
–1 głos
odpowiedź 7 lutego 2016 przez niezalogowany

Pozwolę znowu sobie zacytować fragment tekstu z serwisu warsztat.gd:

2. "Co tu jest źle?"

: Pokaże wam swój kod. Ściągnijcie go i zobaczcie, dlaczego to nie działa? Nie wiem, gdzie tu jest błąd.

Każdy z nas ma swój kod i swoje błędy. W twoim kodzie błędy możesz znaleźć tylko ty sam - zrobisz to najszybciej i najlepiej, bo już go znasz. Nikt nie będzie analizował dziesiątek czy setek linii twojego kodu albo całego projektu.

Podobne pytania

+2 głosów
2 odpowiedzi 252 wizyt
0 głosów
2 odpowiedzi 244 wizyt
pytanie zadane 11 września 2016 w Sieci komputerowe, internet przez thompsonnss Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 1,294 wizyt
pytanie zadane 28 lutego 2016 w Egzaminy zawodowe przez Prime_Bull Obywatel (1,820 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 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!

...