Problem z Silnią (C++)

Odpowiedz Nowy wątek
2011-08-07 18:45
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);
}
edytowany 1x, ostatnio: madmike, 2011-08-07 18:46

Pozostało 580 znaków

2011-08-07 18:55
0

W której linii?


Pozostało 580 znaków

2011-08-07 19:00
Kumashiro
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ć.

Pozostało 580 znaków

2011-08-07 19:01
0

W linii 11 - wyświetlenie wyniku dla x.

Pozostało 580 znaków

2011-08-07 19:35
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;
}
 

Pozostało 580 znaków

2011-08-07 19:35
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?


Znając życie pewnie używa Dev-C++, a raczej starego GCC (tak to się nazywa, prawda?). - Patryk27 2011-08-07 19:59
Visual studio sądząc po nazwie błędu - msm 2011-08-07 20:17
rzeczywiście, więc to nie bardzo może być cały kod. VS sobie z nim radzi bez zająknięcia. - byku_guzio 2011-08-07 20:21

Pozostało 580 znaków

2011-08-07 19:49
0

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

Lubię to ! - mrfustrr 2011-08-07 19:56
No ale to dobry przykład na to jak działa rekurencja, więc może w tej książce silnia była jednym z przykładów ilustrujących jej działanie? - piternet 2011-08-07 20:12
Mogli dać Fibonacciego w te miejsce ... - mrfustrr 2011-08-07 20:14
(brak słów...) To Fibonacci rekurencyjnie jest patologią jak cholera... Nawet w językach funkcyjnych gdzie rekurencja jest wszędzie się tego nie robi. A silnia rekurencyjnie to piękny przykład jak działa rekurencja, nawet mimo że w C++ niezbyt przydatny. - msm 2011-08-07 20:19
ja kiedyś zaimplementowałem (w C# ale to bez znaczenia) Fibonacciego rekurencyjnie z cache'owaniem kilku ostatnich wyników. a ponieważ zawsze potrzebne są dwa poprzednie, to wyszło jak liniowo. - Azarien 2011-08-07 21:55
I jak zwykle wszyscy zapominają o poczciwej funkcji Ackermana, która jest najprostszą funkcją niepierwotnie rekurencyjną - hauleth 2011-08-08 08:50

Pozostało 580 znaków

2011-08-07 20:09
guarded recursion
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.

Nie czepiam się samej rekurencji, a sposobu jej wykorzystania. - absent 2011-08-07 20:11
Jeszcze raz - silnia rekurencyjnie to dobry przykład do nauki. Wolałbyś żeby od razu quicksorta jako przykład zaimplementowano? - msm 2011-08-07 20:20
Nie od funkcja Ackermana lub Sudana. - hauleth 2011-08-08 08:52

Pozostało 580 znaków

2011-08-07 20:28
guarded recursion
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.

Pozostało 580 znaków

2011-08-07 20:35
msm
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//

edytowany 5x, ostatnio: msm, 2011-08-07 20:38

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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