factorials

12/25/2012 03:44 ExHack#1
hallo
Kann mir bitte jemand den code hier erklären?

Code:
#include <iostream> 
const int ArSize =16; 
int main() 
{ 
long long factorials[ArSize]; 
factorials [1] = factorials[0] = 1LL;

for (int i = 2; i < ArSize; i++ ) 
factorials[i] = i * factorials[i-1]; 

for (int i = 0; i < ArSize; i++ ) 
std::cout << i << " ! = " << factorials [i] << std::endl; 

return 0; 
};
Das kommt raus:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
usw. bis
15! = 1307674368000


for (int i = 2; i< ArSize; i++)
factorials[i] = i * factorials[i-1];

Also 2< 16 TRUE und dann geht die 2 auf factorials[i] also factorials[2]=
2 * factorials[2-1]; oder ? Wenn ja was passiert hier: 2 * factorials[2-1]
Was wird da ausgerechnet? 2-1 im array und dann *2 WTF ! Zb. 2-1 ist ja dann 1 und *2 ist ja 2 ok 2! =2.Das gleiche nochmal mit 3. [3-1] *3=6 gut 3! = 6. Aber bei 4 geht das nicht mehr [4-1] *4= 12 ...
Man muss ja immer so rechnen 3! * 2= 6 -> 4!*6=24 usw.

Kann mir bitte jemand das hier erklären? Wie funktionierts!?

Danke
12/25/2012 15:12 snow#2
Der Spaß ist ja die n-Fakultät. Die berechnet man durch ZAHL * (Fakultät von ZAHL-1), für 5 also 5! = 5 * (4!) = 5! = 5 * 4 * 3 * 2 * 1. Das ganze kann man übrigens auch wunderschön via Rekursion lösen. Naja:

Ich glaube, du hast nicht ganz verstanden, wie Arrays funktionieren. factorials[i - 1] bedeutet nicht, dass da jetzt der Wert von i - 1 steht, du zeigst da im Prinzip auf die Zahl, die du im vorherigen Durchlauf errechnet hast.

factorials[2] = 2 * factorials[1] -> schau mal in die oberen Zeilen: factorials [1] = 1LL;

für i = 3:

factorials[3] = 3 * factorials[3 - 1] -> das ist jetzt nicht 3 * 2, weil da 3 - 1 steht, das ist 3 * 2, weil du im vorherigen Durchlauf der Schleife beim Index 2 des Arrays die 2 reingeschrieben hast. factorials[3] ist jetzt also 3 * 2 = 6.

für i = 4:

factorials[4] = 4 * factorials[4 - 1] -> also 4 * factorials[3]. Das ist jetzt nicht 4 * 3, weil da eine 3 in den Klammern steht, das ist 4 * das, was im vorherigen Schritt rausgekommen ist, also 4 * 6 = 24.

usw.

Beschäftige dich mal damit, was ein Array ist und wie es funktioniert, dann wird dir evtl. einiges verständlicher.
12/26/2012 17:29 .Infinite#3
Falls es dir hilft. Rekursiv ist es einfacher zu verstehen...

Code:
int fak(int n)
{
	if (n==0) return 1;
	else return n*fak(n-1);
}
12/26/2012 18:47 .SkyneT.#4
Quote:
Originally Posted by .Infinite View Post
Falls es dir hilft. Rekursiv ist es einfacher zu verstehen...
Wenn man die Funktionsweise der Rekursion kennt, ja.
Sonst wohl eher nicht :p

Aber wie schon gesagt wird hier nur die Fakultät berechnet.
0! = 1
1! = 1
2! = 1 * 2
3! = 1 * 2 * 3
4! = 1 * 2 * 3 * 4
5! = 1 * 2 * 3 * 4 * 5
.....