Getallen Piramide
De output zou als volgt moeten zijn:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
De driehoek van pascal dus.
Dit zou met PHP te doen moeten zijn ofzow, heb vaag iets gehoord over een array in een array of zow, maar geen ID wat er bedoeld wordt.
Iemand enig ID hoe ik dit berekend kan krijgen?
Alleen die getalletjes?
Code (php)
iig bedankt voor de antwoorden
Bedenk jij de logica, maken wij het script :P
1 1
1 2
1 + 1
= 2
zo word ieder getal gevormd door het getal er boven + het getal links er boven.
maar ik ben op dit moment te duf om er een script voor te maken
morgen misschien weer :)
0C0
1C0 1C1
2C0 2C1 2C2
3C0 3C1 3C2 3C3
4C0 4C1 4C2 4C3 4C4
Oftewel met wat loopjes en een functie
cominatie($boven, $onder);
Zou het te maken moeten zijn.
Ik heb zo'n functie ooit eens moeten maken in een rekenmachine voor school. Ik zal binnenkort eens kijken. Nu vlug terug om voetbal te zien :)
Boaz:
de driehoek van pascal,
1 1
1 2
1 + 1
= 2
zo word ieder getal gevormd door het getal er boven + het getal links er boven.
1 1
1 2
1 + 1
= 2
zo word ieder getal gevormd door het getal er boven + het getal links er boven.
Hmm, interesant :)
Kende diej driehoek nog niet :P
dutchcamel:
De logica heeft met kansberekening te maken.
hoorde ik ook al. alleen hoe?
dutchcamel:
Ik heb zo'n functie ooit eens moeten maken in een rekenmachine voor school.
dit is ook voor school :) alleen dan met PHP
Gewijzigd op 15/09/2004 23:19:00 door Bo az
1 5 10 10 5 1
1 6 15 20 15 6 1
1 (1+5) (5+10) (10+10) (10+5) (5+1) 1
1 6 15 20 15 6 1
Edit:
als je dit bij allemaal doet van eerste voorbeeld boaz, dan is het logisch lijkt mij.. het klopt namelijk helemaal op de manier die ik zie :)
als je dit bij allemaal doet van eerste voorbeeld boaz, dan is het logisch lijkt mij.. het klopt namelijk helemaal op de manier die ik zie :)
Gewijzigd op 15/09/2004 23:34:00 door B a s
(php tags voor indenting)
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
?>
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
?>
Zien jullie de logica?
Het getal in het midden is elke keer het opgetelde van de 2 erboven.
Elke rij uit de piramide kan je als array voorstellen.
Elk getal als een slice.
Voor elke slice uit de volgende laag geld dat de waarde van de slice gelijk is aan de slice op dezelfde positie uit de vorige array, en eentje naar links.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
$lagen = 7;
$array[0][0] = 1;
print "1\n<br>";
for ($i=1; $i < $lagen; $i++) {
for ($j=0; $j <= count($array[$i-1]); $j++) {
$array[$i][$j] = $array[$i-1][$j];
// was nodig in perl.. $array[-1] geeft de laatste uit de array weer.. onverachte resultaten.
if (($j-1) >= 0) {
$array[$i][$j] += $array[$i-1][$j-1];
}
}
print join(' ', $array[$i]);
print "\n<br>";
}
?>
$lagen = 7;
$array[0][0] = 1;
print "1\n<br>";
for ($i=1; $i < $lagen; $i++) {
for ($j=0; $j <= count($array[$i-1]); $j++) {
$array[$i][$j] = $array[$i-1][$j];
// was nodig in perl.. $array[-1] geeft de laatste uit de array weer.. onverachte resultaten.
if (($j-1) >= 0) {
$array[$i][$j] += $array[$i-1][$j-1];
}
}
print join(' ', $array[$i]);
print "\n<br>";
}
?>
Wiskundig gezien kan je dit gebruiken, doordat het de binomenale verdeling weergeeft.
Dit helpt je vaststellen hoeveel mogelijkheden er voor een bepaalde kanssituatie is. Simpel: 6 keer 6 gooien met een dobbelsteen.
Wanneer je je voorsteld dat elke keer dat je gooit met een dobbelsteen je wel of niet 6 gooit. Elke worp betekend een stap naar beneden in de piramide. Elke keer 6 betekent een stap naar links, elke niet-6 een stap naar rechts.
Om na 6 worpen 6 keer een 6 gegooit te hebben, zie je dat je in het hokje met een 1 staat. Een hokje naar rechts zou betekenen 5 keer 6 en één keer niet 6. De waarde van het hokje betekend hoeveel mogelijkheden er zijn om die samenstelling te verkrijgen.
De 6e laag van het binomium is: 1 6 15 20 15 6 1
Dus: 1 mogelijkheid om 6x6, 6 op 5x6, 15 op 4x6, 20 op 3x6, 15 op 2x6, 6 op 1x6 en 1 op 0x6.
De kans is dan het aantal mogelijkheden gedeelt door het aantal mogelijkheden uit de gehele laag, maal de kans op 1 keer 6.
Dus de kans dat iemand 6 keer 6 gooit is 1 / (1+6+15+20+15+6+1) = 1/64 * 1/6
de kan op 5 keer 6 is 6/64 * 1/6.
Uw wiskundige..
Gewijzigd op 16/09/2004 00:35:00 door Arend a
Geweldig uitgelegd Arend :)
Het is niet voor niet een BInomiale verdeling, het gaat om 2 gelijke kansen. Een beter voorbeeld is om de piramide voor te stellen als een bak met spijkertjes waar een balletje van boven naar beneden doorheen valt. Ieder getal staat voor het aantal manieren dat het balletje op die plek voorbij kan vallen als het even waarschijnlijk is dat het balletje naar links of rechts zal vallen bij een spijkertje.
De getallen zijn exact gelijk aan wat ik al zei:
0C0
1C0 1C1
2C0 2C1 2C2
3C0 3C1 3C2 3C3
4C0 4C1 4C2 4C3 4C4
4C2 is het aantal combinaties van 2 uit 4. Door daarmee te werken en het script op die manier te maken is het veel uitgebreider te gebruiken en kan ook alleen de 85e rij bijvoorbeeld weergegeven worden. 4 boven 2 (4C2 dus) is gelijk aan:
4! / (2! * (4-2)!) dus 4! / (2! * 2!) oftewel (4 * 3 * 2 * 1) / ((2 * 1) * (2 * 1)) = 24 / 4 = 6
Om een mooie functie te maken in PHP heb je dus een functie faculteit($getal); nodig en een functie combinatie($boven, $onder); die van faculteit(); gebruik maakt. Op die manier zou je makkelijk alleen de 85e rij kunnen laten zien die er als volgt uit ziet:
84C0 84C1 84C2 ...tot aan... 84C82 84C83 84C84
In PHP zou het er dan zo uitzien:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?
function faculteit($getal) {
$output = 1;
for ($i = $getal; $i > 1; $i--) {
$output = $output * $i;
}
return $output;
}
function permutatie($groot, $klein) {
$output = faculteit($groot) / faculteit($groot - $klein);
return $output;
}
function combinatie($boven, $onder) {
$output = faculteit($boven) / (faculteit($onder) * faculteit($boven - $onder));
return $output;
}
function pascal($start, $stop) {
$output = '';
for ($i = $start - 1; $i < $stop; $i++) {
for ($j = 0; $j <= $i; $j++) {
$output .= combinatie($i, $j).' ';
}
$output .= '<br>';
}
return $output;
}
echo pascal(4, 5);
?>
function faculteit($getal) {
$output = 1;
for ($i = $getal; $i > 1; $i--) {
$output = $output * $i;
}
return $output;
}
function permutatie($groot, $klein) {
$output = faculteit($groot) / faculteit($groot - $klein);
return $output;
}
function combinatie($boven, $onder) {
$output = faculteit($boven) / (faculteit($onder) * faculteit($boven - $onder));
return $output;
}
function pascal($start, $stop) {
$output = '';
for ($i = $start - 1; $i < $stop; $i++) {
for ($j = 0; $j <= $i; $j++) {
$output .= combinatie($i, $j).' ';
}
$output .= '<br>';
}
return $output;
}
echo pascal(4, 5);
?>
Dit geeft netjes als output:
1 3 3 1 <br>1 4 6 4 1 <br>
Het scriptje is nu even snel geschreven en voor de volledigheid staan ook permutaties erbij die niet nodig zijn.
Eigenlijk zou bij combinatie() en permutatie() nog gecontroleerd moeten worden of het 1e getal groter dan of gelijk aan het 2e getal is en of het 2e getal groter dan of gelijk aan 0 is. Ook moeten de cijfers gehele getallen zijn bij die functies en ook dat wordt nog niet gecontroleerd zou je allemaal kunnen maken.
Bij faculteit() moet het getal ook een geheel getal groter dan of gelijk aan 0 zijn.
Bij pascal() moeten het ook gehele getallen zijn groter dan 0. Het 2e getal moet daarbij groter dan of gelijk zijn aan het 1e blablabla.
Er wordt nu altijd achter een regel een zinloze spatie gezet daaraan zou ook nog wat gedaan kunnen worden net als de <br> op de allerlaatste regel die ook niet perse nodig is.
Maar dat was nogal overdreven / onnodig of had ik geen zin in om het er allemaal nog bij te maken :P
Gewijzigd op 16/09/2004 01:29:00 door dutchcamel
thnx voor jullie antwoorden!!!
wordt die avatar van je nou niet eens moe met lopen Boaz??
[/hartstikke offtopic]
nice scripting van de piramide :o)
Bas:
[hartstikke offtopic]
wordt die avatar van je nou niet eens moe met lopen Boaz??
[/hartstikke offtopic]
wordt die avatar van je nou niet eens moe met lopen Boaz??
[/hartstikke offtopic]
soms wel jah, dan valt ie even om, maar dan gaat ie vaak meteen weer door.
Ik heb er ook meteen een stukje bijgemaakt om de parsetime te berekenen, is wel handig om bij te houden als je veel rijen wil zien.
De faculteiten die geweest zijn worden opgeslagen in een array, en bij een nieuwe aanroep van faculteit() wordt eerst gecontroleerd of die arraywaarde niet al bestaat. Zo ja gebruikt hij die, anders wordt het uitgerekend en de uitkomst in de array gemikt.
Ook wordt bij combinatie() gekeken of het 2e getal 0 is, zo ja is de uitkomst altijd 1. Ook als de 2 getallen gelijk zijn. Bij permutatie() (functie die er voor de volledigheid bij zit maar niet gebruikt wordt) is dat ook ingebouwd, maar dan alleen als het 2e getal 0 is. Omdat 2 dezelfde getallen daar dus geen 1 als uitkomst moet geven.
Dit is de code uiteindelijk geworden:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?
function parsetime_start() {
global $parsetime;
list($micro, $seconds) = explode(' ', microtime());
$parsetime = $micro + $seconds;
return TRUE;
}
function parsetime_stop() {
global $parsetime;
list($micro, $seconds) = explode(' ', microtime());
$parsetime = $micro + $seconds - $parsetime;
return TRUE;
}
function parsetime($digits = 5) {
global $parsetime;
return number_format($parsetime, $digits, '.', '');
}
class probability {
var $facArray = array();
function faculteit($getal) {
if (isset($this->facArray[$getal])) {
$output = $this->facArray[$getal];
}
else {
$output = 1;
for ($i = $getal; $i > 1; $i--) {
$output = $output * $i;
}
$this->facArray[$getal] = $output;
}
return $output;
}
function permutatie($groot, $klein) {
return $klein == 0 ? 1 : $this->faculteit($groot) / $this->faculteit($groot - $klein);
}
function combinatie($boven, $onder) {
return $onder == 0 || $boven == $onder ? 1 : $this->faculteit($boven) / ($this->faculteit($onder) * $this->faculteit($boven - $onder));
}
function pascal($start, $stop) {
$output = '';
for ($i = $start - 1; $i < $stop; $i++) {
for ($j = 0; $j <= $i; $j++) {
$output .= $this->combinatie($i, $j).' ';
}
$output .= '<br>';
}
return $output;
}
}
parsetime_start();
$probability = new probability();
echo $probability->pascal(1, 100);
parsetime_stop();
echo parsetime();
?>
function parsetime_start() {
global $parsetime;
list($micro, $seconds) = explode(' ', microtime());
$parsetime = $micro + $seconds;
return TRUE;
}
function parsetime_stop() {
global $parsetime;
list($micro, $seconds) = explode(' ', microtime());
$parsetime = $micro + $seconds - $parsetime;
return TRUE;
}
function parsetime($digits = 5) {
global $parsetime;
return number_format($parsetime, $digits, '.', '');
}
class probability {
var $facArray = array();
function faculteit($getal) {
if (isset($this->facArray[$getal])) {
$output = $this->facArray[$getal];
}
else {
$output = 1;
for ($i = $getal; $i > 1; $i--) {
$output = $output * $i;
}
$this->facArray[$getal] = $output;
}
return $output;
}
function permutatie($groot, $klein) {
return $klein == 0 ? 1 : $this->faculteit($groot) / $this->faculteit($groot - $klein);
}
function combinatie($boven, $onder) {
return $onder == 0 || $boven == $onder ? 1 : $this->faculteit($boven) / ($this->faculteit($onder) * $this->faculteit($boven - $onder));
}
function pascal($start, $stop) {
$output = '';
for ($i = $start - 1; $i < $stop; $i++) {
for ($j = 0; $j <= $i; $j++) {
$output .= $this->combinatie($i, $j).' ';
}
$output .= '<br>';
}
return $output;
}
}
parsetime_start();
$probability = new probability();
echo $probability->pascal(1, 100);
parsetime_stop();
echo parsetime();
?>
Gewijzigd op 27/09/2004 18:18:00 door dutchcamel
als je toch een class maakt, kun je beter die functies erboven ook in de class zetten :) is netter
Is daar niet een uitleg / tutorial ofzo over te vinden. Dus niet de basis maar gewoon over wanneer het nu echt nuttig is enzo?