Skip to content

Instantly share code, notes, and snippets.

@Kielx
Created April 4, 2021 18:47
Show Gist options
  • Save Kielx/34215efb64a8307867593dbffb46c773 to your computer and use it in GitHub Desktop.
Save Kielx/34215efb64a8307867593dbffb46c773 to your computer and use it in GitHub Desktop.
Lab3
#include <stdio.h>
#include <time.h>
long int fibIt(int n)
//Funkcja oblicza i zwraca okreslony wyraz ciagu Fibonacciego metoda iteracyjna
{
long int i, t1 = 0, t2 = 1, nastepnyWyraz;
for (i = 1; i <= n; ++i)
{
nastepnyWyraz = t1 + t2;
t1 = t2;
t2 = nastepnyWyraz;
}
return t1;
}
long int fibRe(int n)
{
if (n <= 1)
return n;
return fibRe(n - 1) + fibRe(n - 2);
}
void wypiszCzasyFibo(int wyrazCiagu)
{
clock_t tik = clock();
int wyraz1 = fibRe(wyrazCiagu);
clock_t tak = clock();
double czasRe = ((double)(tak - tik) / CLOCKS_PER_SEC);
tik = clock();
int wyraz2 = fibIt(wyrazCiagu);
tak = clock();
double czasIt = ((double)(tak - tik) / CLOCKS_PER_SEC);
printf("Wyraz %d ciągu fibonacciego to %d w wariancie rekurencyjnym jak i %d w wariancie iteracyjnym.\n", wyrazCiagu, wyraz1, wyraz2);
printf("Od początku wywołania funkcji do ich zakończenia:\n");
printf("Upłynęło: %f sekund w wariancie rekurencyjnym\n", czasRe);
printf("Upłynęło: %f sekund w wariancie iteracyjnym\n", czasIt);
}
void zad2()
{
wypiszCzasyFibo(5); // Rekurencja - 0.000003s, Iteracja - 0.000001s
wypiszCzasyFibo(10); // Rekurencja - 0.000002s, Iteracja - 0.000001s
wypiszCzasyFibo(20); // Rekurencja - 0.000043s, Iteracja - 0.000001s - Czas zaczyna się różnić
wypiszCzasyFibo(40); // Rekurencja - 0.677339s, Iteracja - 0.000001s - Funkcja rekurencyjna trwa już niemalże sekundę
wypiszCzasyFibo(45); // Rekurencja - 7.695842s, Iteracja - 0.000001s -
wypiszCzasyFibo(47); // Rekurencja - 20.013487s, Iteracja - 0.000001s -
//Dla wartości 47 funkcja rekurencyjna trwa już 20 sekund, zaś iteracyjna dalej w czasie 1x10^-6s
}
unsigned long long silniaIt(int n)
{
int i;
unsigned long long silnia = 1;
for (i = 1; i <= n; ++i)
{
silnia *= i;
}
return silnia;
}
unsigned long long silniaRe(int n)
{
if (n <= 1)
{
return n;
}
else
return (silniaRe(n - 1) * n);
}
void wypiszCzasySilnia(int liczbaSilni)
{
clock_t tik = clock();
unsigned long long wyraz1 = silniaRe(liczbaSilni);
clock_t tak = clock();
double czasRe = ((double)(tak - tik) / CLOCKS_PER_SEC);
tik = clock();
unsigned long long wyraz2 = silniaIt(liczbaSilni);
tak = clock();
double czasIt = ((double)(tak - tik) / CLOCKS_PER_SEC);
printf("Silnia %d to %llu w wariancie rekurencyjnym jak i %llu w wariancie iteracyjnym.\n", liczbaSilni, wyraz1, wyraz2);
printf("Od początku wywołania funkcji do ich zakończenia:\n");
printf("Upłynęło: %f sekund w wariancie rekurencyjnym\n", czasRe);
printf("Upłynęło: %f sekund w wariancie iteracyjnym\n", czasIt);
}
void zad1()
{
wypiszCzasySilnia(1); // Rekurencja - 0.000002s, Iteracja - 0.000001s
wypiszCzasySilnia(10); // Rekurencja - 0.000001s, Iteracja - 0.000001s
wypiszCzasySilnia(50); // Rekurencja - 0.000002s, Iteracja - 0.000001s
wypiszCzasySilnia(60); // Rekurencja - 0.000001s, Iteracja - 0.000000s
wypiszCzasySilnia(65); // Rekurencja - 0.000001s, Iteracja - 0.000001s
/* Wszystkie funkcje sa wywoływane niemalże natychmiastowo
// W przypadku większych wartości standardowe największe wartośći unsigned long long nie są w stanie
przyjąć zwracanych liczb z funkcji */
wypiszCzasySilnia(10000); // Rekurencja - 0.000152s, Iteracja - 0.000024s
wypiszCzasySilnia(100000); // Rekurencja - 0.001959s, Iteracja - 0.000317s
wypiszCzasySilnia(200000); // Rekurencja - 0.003787s, Iteracja - 0.000477s
}
int main()
{
zad1();
printf("\n\n");
zad2();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment