konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Czy jest ktoś w stanie wskazać błąd w kodzie?
Moim celem jest znalezienie największej wartości wyrazu ciągu Fibonacciego nie większej od danej wartości podanej z wejścia :)


#include <stdio.h>
#include <stdlib.h>

int fib_rek(int n){
if(n < 2){ return n; }
else{ return fib_rek(n-1)+fib_rek(n-2); }
}

int licz(int i, int m, int n)
{
for(i=1; fib_rek(n)<=m; i++ )
return ( licz(i,n,m));
}

int main(void)
{
int n,m,i;
scanf ("%d", &m);
printf("%d", licz(i,n,m));

return 0;
}
Dariusz Grochocki edytował(a) ten post dnia 18.04.12 o godzinie 20:00

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Dariusz Grochocki:
Czy jest ktoś w stanie wskazać błąd w kodzie?
Nawet kilka :) Nie inicjujesz zmiennych w main, pomyliłeś kolejność argumentów w wywołaniach licz(), przysłaniasz zmienną i, z pętli for wychodzisz już po pierwszej iteracji a z punktu widzenia optymalizacyjnego to dużo rzeczy liczysz dużo za dużo razy.
Powodzenia.Krzysztof Kawa edytował(a) ten post dnia 18.04.12 o godzinie 20:22

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Dadaj może jakieś komentarze do tego kodu bo ja się zgubiłem. Mam wrażenie że jest jakieś zamieszanie z n i m - n (w licz juz jest to m nie jest nigdzie inicjowane to nie wiadomo co tam jest.
Ja to bym to zrobił tak

#include <iostream>

using namespace std;

int main()
{
int v1 =0;
int v2 =1;
int temp;
while(1)
{
if( v2 <= 670 ) {
temp = v2;
v2 = v2+v1;
v1 = temp;
}
else{
break;
}
}
cout <<"v1 " <<v1<< endl;
cout <<"v2 " <<v2<< endl;
return 0;
}

Brakuje sczytywanie z stdin i jest bardziej c++ ale myślę że coś można wyczaić.

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Dzięki Panowie za uwagi i sugestie. Mam nadzieję, że wkrótce będę mógł się tu pochwalić poprawnym programem :=)

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Tak na szybko:


int
fib(int n)
{
int a[MAXVAL];
int i, j, sum;

a[0] = 0;
a[1] = 1;
i = 0;
j = 1;

while (a[i] < n) {
printf("%d ", a[i]);
sum = a[i] + a[j];
a[i++] = a[j++];
a[j] = sum;
}
printf("\n");
return a[i - 2];
}
Andrzej K. edytował(a) ten post dnia 19.04.12 o godzinie 15:16

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale


#include <iostream>

using namespace std;

int
fib(int n)
{
int ap = 0;
int a = 1;
int t;
while(a <= n) {
cout << a << endl;
t = ap;
ap = a;
a = a + t;
}
return ap;
}

int main() {
int n = 20;
cout << "Max(" << n << ") = " << fib(n) << endl;
return 0;
}


http://ideone.com/BF16KPiotr L. edytował(a) ten post dnia 19.04.12 o godzinie 15:29

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Panowie - jestem pewien, że większość na tej grupie jest w stanie napisać program z ciągiem Fibonacciego przez sen i jeden będzie lepszy od drugiego :)

Chłopak się najwyraźniej uczy - pomaganie jest wskazane, ale nie róbcie za niego zadań domowych. Programowanie to też(jeśli nie głównie) sztuka kombinowania, pomóżcie ją opanować.

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Krzysztof Kawa:
Panowie - jestem pewien, że większość na tej grupie jest w stanie napisać program z ciągiem Fibonacciego przez sen i jeden będzie lepszy od drugiego :)

Program Darka wg mojej wiedzy nie nadawał się nawet do przeróbki, dlatego podałem swój.
Nie ze względu na drobne niedociągnięcia ale ze względów merytorycznych.

fib_rek(3) =>
fib_rek(2) + fib_rek(1) =>
fib_rek(1) + fib_rek(0) + 1 =>
1 + 1 + 1 =>
3

W tym wypadku n to nie liczba wejściowa tylko nr kolejnej liczby Fibonacciego - co nie jest zgodne z zadaniem.Piotr L. edytował(a) ten post dnia 19.04.12 o godzinie 16:46

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

możesz wypróbować(c++):


#include <iostream>
#include <vector>


using namespace std;


unsigned int fibonacci(unsigned int n)
{
if(n == 0) return 0;
if(n == 1) return 1;

return fibonacci(n-1) + fibonacci(n-2);
}


unsigned int print_vector(vector<unsigned int> v)
{
cout << endl << endl;

for(unsigned int i=0; i<v.size(); ++i)
{
cout << v[i] << endl;
}
}


unsigned int select_max(vector<unsigned int> max)
{
sort(max.begin(), max.end());

return max[max.size()-1];
}


int main()
{
unsigned int min = 0;
unsigned int max = 0;
unsigned int temp = 0;

vector<unsigned int> fib;

cout << "Podaj zakres liczb:\n\n";

cin >> min >> max;

for(unsigned int i=min; temp<max; ++i)
{
temp = (fibonacci(i));

if(temp <= max) fib.push_back(temp);
}

print_vector(fib);

cout << endl << "Najwiekszy wyraz ciagu Fibonacciego dla zakresu liczb "
<< min << " - " << max << " to: " << select_max(fib) << endl;

return 0;
}
Marcin K. edytował(a) ten post dnia 08.05.12 o godzinie 10:04

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Marcin K.:

unsigned int print_vector(vector<unsigned int> v)


W powyzszym przypadku dobrze byloby przekazac obiekt klasy vector przez referencje, czyli:


void print_vector(const vector<unsigned int>& v)


Dzieki takiemu zapisowi, mozna znaczaco przyspieszyc program i zaoszczedzic sporo RAMu. Zeby nie byc goloslownym dodam, ze testowy program, ktory przed chwila napisalem (uzylem w nim vectora 500 tys elementow typu unsigned int) przyspieszyl nie raz, nie dwa a 15 tysiecy razy.


for(unsigned int i=0; i<v.size(); ++i)


Uwazalbym na tego typu konstrukcje. Metoda size zwroci Ci typ size_t, ktorego zakres jest (a przynajmniej moze byc) inny niz unsigned int. Proponowalbym zastapic powyzszy kod odpowiednikiem:


for(size_t i=0; i < v.size(); ++i)


Jeszcze lepszym (w mojej opinii) pomyslem byloby uzycie iteratorow.


unsigned int select_max(vector<unsigned int> max)
{
sort(max.begin(), max.end());

return max[max.size()-1];
}


Zamiast tego mozna uzyc:


*std::max_element(max.begin(), max.end())


Wyjdzie na to samo, a jednak nie trzeba wywazac otwartych drzwi :)Tomasz K. edytował(a) ten post dnia 14.05.12 o godzinie 22:49

konto usunięte

Temat: największa wartość wyrazu ciągu Fibonacciego w przedziale

Marcin K.:
unsigned int print_vector(vector<unsigned int> v)
{
cout << endl << endl;

for(unsigned int i=0; i<v.size(); ++i)
{
cout << v[i] << endl;
}
}

Wypisywanie elementów możesz uprościć stosując taki kod:
copy(v.begin(), v.end(), std::ostream_iterator<unsigned int>(std::cout, " "));


Do wyszukania elementu największego możesz użyć:
*std::max_element(v.begin(), v.end());



Wyślij zaproszenie do