silnia C++

0

Witam,
czy może mi ktoś pomóc "rozkminić" dlaczego poniższa funkcja zwraca prawidłowy wynik :)
Nie mogę zrozumieć dlaczego jak wpisze się do tej funkcji liczbę 5 to ona zwróci liczbę 120... Jest to funkcja rekurencyjna, ale chodzi mi o to, że ten wynik nie jest nigdzie zapisywany więc dlaczego program zwraca przemnożenie wszystkich liczb a nie 1? W końcu ostatnia instrukcja, która się wykona to "return 1;"! I wydawało mi się, że taki wynik powinien zostać zwrócony.
Bardzo proszę o jakieś łopatologiczne wyjaśnienie.

 int silnia(int liczba)
{
	if(liczba == 1)
		return 1;
	else
		return silnia(liczba-1)*liczba;
}
0

To popatrz jak wyglądać będzie return dla silnia(5):

return silnia(4) * 5

A silnia(4)?

return silnia(3) * 4

Więc sumarycznie silnia(5) będzie miała:

return silnia(4) * 5 = silnia(3)*4*5 = silnia(2)*3*4*5 = silnia(1)*2*3*4*5 = 1*2*3*4*5
0

No tak, to mniej więcej rozumiem - chociaż trochę mi się to miesza. Problem jest jednak inny.
Funkcja ma warunek if(liczba == 1) return 1; który kończy działanie tej funkcji i zwraca 1. Więc pytanie jest dlaczego funkcja zwraca 120 a nie 1? Przecież ostatnią zwracaną wartością jest 1 (?)

0

przecież ten return 1 zwraca jedynkę tylko w wywołaniach silnia(1), reszta wzoru jest obliczana jak kol. Shalom pokazał.

0

żeby zrozumieć rekurencję trzeba najpierw zrozumieć rekurencję ;)
odpal sobie kod krok po kroku i podglądaj wartości zmiennych a wszystko stanie się jasne

ale ja się podepnę przy okazji - bo potrzebuję zrobić funkcję silni dla liczb rzeczywistych
czy ktoś ma gdzieś taki algorytm bo w internecie znajduję tylko proste algorytmy dla liczb naturalnych a samemu chyba przespałem te lekcje matematyki ;)

np (2.5)! = 3.3233509704478425511840640312646

nie za bardzo wiem jak to się liczy

0
bogdans napisał(a)

http://pl.wikipedia.org/wiki/Funkcja_%CE%93

no tak
czyli co? mam zrobić zwykłą całkę?

zrobiłem na próbę licząc całkę metodą Simpsona i liczy poprawnie, ale robi w cholerę obliczeń a nadal nie jest tak dokładne jak funkcja ze zwykłego windowsowego kalkulatora
dlatego pytam o poprawny algorytm

  • ok - znalazłem: http:*rosettacode.org/wiki/Gamma_function (chociaż nie mam pojęcia jak to działa ;))

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