Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z wydajnością i szybkością działania programu.

Ostatnio zmodyfikowano 2016-06-03 19:02
Autor Wiadomość
Cantharis
Temat założony przez niniejszego użytkownika
Problem z wydajnością i szybkością działania programu.
» 2016-06-03 14:15:14
Miałem za zadanie napisać program (jestem wielkim nowicjuszem), w którym rozwiąże dowolnie wybrany problem używając iteracji i rekurencji. Program działa jednak przy wyliczaniu już 40/45 wyrazu ciągu Fibonacciego (taki wybrałem temat) schodzi mu co raz dłużej.

C/C++
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
using namespace std;

long double fibonaccirek( int z )
{
    if( z == 1 || z == 2 ) return 1;
    else return fibonaccirek( z - 1 ) + fibonaccirek( z - 2 );
   
}

int main()

{
    system( "color B5" );
    long double fibonacciite[ 100000 ];
    int x;
   
   
    fibonacciite[ 0 ] = 1;
    fibonacciite[ 1 ] = 1;
   
    cout << "Podaj ktory wyraz ciagu chcesz obliczyc: "; cin >> x; //Wyraz ci¹gu mo¿e byæ tylko i wy³¹cznie liczb¹ naturaln¹ dodatni¹
    cout << setprecision( 1000000 );
    for( int i = 2; i < x; i++ )
    {
        fibonacciite[ i ] = fibonacciite[ i - 1 ] + fibonacciite[ i - 2 ];
    }
   
   
    system( "cls" );
   
    cout << "Podany wyraz ciagu obliczony rekurencyjnie: " << fibonaccirek( x ) << endl;
    cout << endl << "Podany wyraz ciagu obliczony iteracyjnie: " << fibonacciite[ x - 1 ] << endl;
    if( x == 1 )
    {
       
       
        cout << endl << "Zlota liczba nie istnieje za malo wyrazow ciagu" << endl;
    }
    else
    {
       
       
        cout << endl << "Zlota liczba dla podanej ilosci wyrazow obliczona rekurencyjnie: " << fibonaccirek( x ) / fibonaccirek( x - 1 ) << endl;
        cout << endl << "Zlota liczba dla podanej ilosci wyrazow obliczona iteracyjnie: " << fibonacciite[ x - 1 ] / fibonacciite[ x - 2 ];
       
    }
   
   
   
    cin.ignore();
    getchar();
    return 0;
}

Jeżeli jest coś co mógłbym zmienić by usprawnić ten program proszę o pomoc :).
P-148836
mateczek
» 2016-06-03 14:30:00
C/C++
// trzy razy liczysz to samo
cout << endl << "Zlota liczba dla podanej ilosci wyrazow obliczona rekurencyjnie: " << fibonaccirek( x ) / fibonaccirek( x - 1 ) //tutaj dwa razy liczysz ciąg od początku
//[...]
cout << "Podany wyraz ciagu obliczony rekurencyjnie: " << fibonaccirek( x ) << endl; // tutaj trzeci raz znów od początku
P-148837
Cantharis
Temat założony przez niniejszego użytkownika
» 2016-06-03 14:40:40
Jak powinienem to zapisać by obejść te powtórki??
P-148838
mateczek
» 2016-06-03 15:20:53
A po co?? Skoro masz zaprezentować działanie to się nada. A jak chcesz wydajny program to zrób tylko na pętli for jednokrotne liczenie.
P-148839
pekfos
» 2016-06-03 16:13:18
Jak powinienem to zapisać by obejść te powtórki??
Jest coś takiego jak zmienna. Możesz zapisać do niej wartość.

A najlepiej nie rób zmiennej, tylko ich tablicę, tak jak zrobiłeś w metodzie iteracyjnej. Tam buforujesz wyniki, by niczego nie liczyć 2 razy, zrób to samo w podejściu rekurencyjnym.
P-148841
Cantharis
Temat założony przez niniejszego użytkownika
» 2016-06-03 19:02:01
Ok, dziękuje wszystkim za pomoc i zamykam temat :).
P-148844
« 1 »
  Strona 1 z 1