Problem z Silnią (C++)

0

Nie wiem jak poprawić mój kod - wyświetla błąd C3861: 'silnia': identifier not found

 
#include <iostream>
#include <cstdio>

using namespace std;

long silnia(long n)
{
	if (n <2) {return 1;}
	else return silnia(n-1)*n;
}

int main()
{
	long x;
	cout << "Podaj liczbe dodatnia: " << endl;
	cin >> x;
	cout << x <<"! = " << silnia(x);
}
0

W której linii?

0

Hmmm... U mnie na GCC bangla.
Może introspekcja? Po "using namespace" dodaj linijkę "long silnia(long);" i zobacz czy kompilator łaskawie zechce współpracować.

0

W linii 11 - wyświetlenie wyniku dla x.

0

Code Blocks kompiluje program bez problemu i działa.

 
#include <iostream>
#include <cstdio>

using namespace std;

long silnia(long n)
{
        if (n <2)
            return 1;
        else return silnia(n-1)*n;
}

int main()
{
        long x;
        cout << "Podaj liczbe dodatnia: " << endl;
        cin >> x;
        cin.ignore();
        cout << x <<"! = " << silnia(x);
        getchar();
        return 0;
}

0

Ten kod jest poprawny, czego używasz do kompilacji? I czy to na pewno cały kod, czy wyciąłeś z niego coś na potrzeby wrzucenia na forum?

0

Obliczanie silni na podstawie rekurencji to patologia. Spal książkę w której to wyczytałeś.

0
absent napisał(a)

Obliczanie silni na podstawie rekurencji to patologia. Spal książkę w której to wyczytałeś.

Należy dodać: w C/C++ i tylko jeżeli nie stosujesz rekurencji ogonowej. Rekurencja nie jest złem wcielonym, to bardzo potężna i zarazem czytelna konstrukcja. Większość języków programowania to tylko pewne abstrakcje, nie assemblery z czytelniejszą składnią, program jest opisem rozwiązania problemu, nie bezpośrednim zapisem kodu, który ma wykonać procesor.

1
MSM napisał(a)

awet w językach funkcyjnych gdzie rekurencja jest wszędzie się tego nie robi.

Jak nie? Fibonacci nadal jest liczony rekurencyjnie, chociaż zazwyczaj pośrednio, drzewo operacji zostało zlinearyzowane za pomocą spamiętywania. To klasyczny przykład spłaszczania operacji o strukturze drzewiastej, obok liniowego przechodzenia drzewa w oparciu o CPS.

0

Jak nie? Fibonacci nadal jest liczony rekurencyjnie, chociaż zazwyczaj pośrednio, drzewo operacji zostało zlinearyzowane za pomocą spamiętywania. To klasyczny przykład spłaszczania operacji o strukturze drzewiastej, obok liniowego przechodzenia drzewa w oparciu o CPS.

Good point. Racja, musi być rekurencyjnie bo iteracji jako takiej (w jęz. czysto funkcyjnych) nie ma.
Chodziło mi o to że naiwna rekurencyjna implementacja Fibonacciego zwiększa drastycznie złożoność obliczeniową.

*PS - widziałem kiedyś fajną listę kilkunastu różnych implementacji Fibonacciego w Haskellu, znalazłem tylko taką skróconą wersję (a może to jednak było to...) http:*www.haskell.org/haskellwiki/The_Fibonacci_sequence//

1 użytkowników online, w tym zalogowanych: 0, gości: 1