hoe zouden jullie dit doen?

  • Onderwerp starter Onderwerp starter pum
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

pum

Gebruiker
Lid geworden
18 dec 2009
Berichten
193
ik moet het volgende berekenen met php maar kom er even niet uit :) ben nog een beginner en ben voor mezelf bezig met oefeningen om beter de basis te begrijpen.

// 1*1 = 1;
// 2*1 = 2;
// 3*2 = 6;
// 4*6 = 24;
// 5*24 = 120;

// 1 * 1 = uitkomst 1
// 2* uitkomst1 = $uitkomst 2
// 3 * uitkomst2 = $uitkomst 3
// 4 * uitkomst3 = uitkomst 4
 
Laatst bewerkt:
lol rekenfoutje ik probeer 1 * 1 te vermenigvuldigen. die uitkomst moet dan keer 2 de uitkomst daarvan keer 3.
 
Laatst bewerkt:
Alles wat achter // staat, is commentaar en doet verder niets.

B.v.

<html>
<body>
<?php
$uitkomst1 = 1*1;
$uitkomst2 = $uitkomst1 * 2;
$uitkomst3 = $uitkomst2 * 3;
echo $uitkomst1;
echo "<br />";
echo $uitkomst2;
echo "<br />";
echo $uitkomst3;
echo "<br />";
?>
</body>
</html>


etc.
Een variabele begint met $ en aan het eind van iedere regel ;

Verder is er op internet veel te vinden v.w.b. tutorials en voorbeelden en fora.
 
Laatst bewerkt:
Je wilt faculteit berekenen? (Dat wil zeggen; de vermenigvuldiging van alle getallen tussen 1 en [var])?

Je zou een functie als deze kunnen gebruiken:

PHP:
function fac( $top ) {
  $out = 1;
  for ( $i = 1; $i <= $top ; $i++ ) {
    $out *= $i;
  }
  return $out;
}

Niet getest, maar als ik het goed heb zou het nu zo moeten werken:
PHP:
fac( 2 ); // 2
fac( 3 ); // 6
fac( 4 ); // 24
fac( 5 ); // 120
// etc.

Heb je daar wat aan?
 
Laatst bewerkt:
Nog een voorbeeld:

<?php
function faculteit($getal)
{
$uitkomst = 1;
while($getal > 0)
{
$uitkomst *= $getal;
$getal--;
}
return $uitkomst;
}

echo faculteit(6); // Output: 720
?>
 
Laatst bewerkt:
Volgens mij gaat je functie niet goed Frats.
Return-waarde moet volgens mij $out zijn en je 3e FOR-parameter kijk ik ook raar tegenaan.

Wellicht ook leuk:

Recursief:
PHP:
function fac($total, $multiply = 1, $times = 1) {
  $return = $times*$multiply;
  if($times == $total) {
    return $return;
  } else {
    fac($total, $return, $times++);
  }
}
echo fac(3);
echo fac(5);
/*
Werking van functie
fac(5, 1, 1)
1 == 5?
fac(5, 1, 2)
2 == 5?
fac(5, 2, 3)
3 == 5?
fac(5, 6, 4)
4 == 5?
fac(5, 24, 5)
5 == 5?
return 120
*/
 
Oeps. Dat krijg je als je met je duffe hoofd functies gaat schrijven en ze niet test. Ik heb ze even verbeterd, thanks Tha Devil.
 
de functie van krolik is wat ik bedoel. Zou je er misschien commentaar bij willen zetten hoe het precies werkt :) bedankt alvast

function faculteit($getal){
$uitkomst = 1;
while($getal > 0)
{
$uitkomst *= $getal;
$getal--;
}
return $uitkomst;
}

echo faculteit(5);
 
Laatst bewerkt:
Als testje een benchmark gemaakt alle zit met een probleem, de recursieve functie laat geen waarde zien terwijl hij wel bij de return komt.

Krolik z'n oplossing is trouwens het snelste :)
PHP:
<?php
/***
 * Benchmarking three implementations of a factorial-function
 * @source	http://www.helpmij.nl/forum/showthread.php?t=520541
 * @creator Tha Devil
 */
 
/***
 *	Factorial using a FOR-loop
 *	@author:	Frats http://www.helpmij.nl/forum/member.php?u=129980
 */
function fac_for( $top ) {
	$out = 1;
	for ( $i = 1; $i <= $top ; $i++ ) {
		$out *= $i;
	}
	return $out;
}

/***
 *	Factorial using a WHILE-loop
 *	@author:	krolik http://www.helpmij.nl/forum/member.php?u=79683
 */
function fac_while($getal)
{
	$uitkomst = 1;
	while($getal > 0)
	{
		$uitkomst *= $getal;
		$getal--;
	}
	return $uitkomst;
}

/***
 *	Factorial using a recursion
 *	@author:	Tha Devil http://www.helpmij.nl/forum/member.php?u=23534
 */
function fac_recursive($total, $multiply = 1, $times = 1) {
	$solved = $times * $multiply;
	if($times == $total) {
		return $solved;
	} else {
		$times++;
		fac_recursive($total, $solved, $times);
	}
}

$aBench = array();
$aSolutions = array();

$iForStart = microtime(true);
$aSolutions[] = 'For: '. fac_for(5);
$iForEnd = microtime(true);
$aBench[] = 'Factorial FOR-loop in '. round(($iForEnd - $iForStart)*1000,4 ) .'ms';
unset($iForStart, $iStartEnd);

$iForStart = microtime(true);
$aSolutions[] = 'While: '. fac_while(5);
$iForEnd = microtime(true);
$aBench[] = 'Factorial WHILE-loop in '. round(($iForEnd - $iForStart)*1000,4 ) .'ms';
unset($iForStart, $iStartEnd);

$iForStart = microtime(true);
$aSolutions[] = 'Recursive: '. fac_recursive(5);
$iForEnd = microtime(true);
$aBench[] = 'Factorial recursive in '. round(($iForEnd - $iForStart)*1000,4 ) .'ms';

echo '<pre>';
print_r($aBench);
echo '</pre>';
echo '<pre>';
print_r($aSolutions);
echo '</pre>';

?>
Iemand die de fout ziet?
 
Ik ben niet zo'n fan van recursie dus ik ben er niet super goed in, maar als ik het goed begrijp dan krijg je niks terug omdat het antwoord van de eerste aanroep terug moet komen, niet van de laastste.

Wat er nu gebeurd, is dit:

fac_recursive( 5 ) -> fac_recursive( 5, 1, 2 ) -> fac_recursive( 5, 2, 3 ) -> fac_recursive( 5, 6, 4 ) -> fac_recursive( 5, 24, 5 )

Vervolgens returnt fac_recursive( 5, 24, 5 ) de waarde 120 (de correcte uitkomst) naar de functie die hem aanriep; en dat is fac_recursive( 5, 6, 4 ). Alleen die returnt vervolgens niks, want hij is in de else gegaan, en zal dus gewoon aan het eind van de functie komen en NULL terugsturen naar degene die hem aanroept. En die doet hetzelfde naar degene boven hem; en zo gaat er een serie NULL terug door de ketting van functies totdat het uiteindelijke antwoord NULL is.

Je moet zorgen dat het echte antwoord iedere keer teruggezonden wordt...
 
Als je in de recursieve functie de regel
PHP:
fac_recursive($total, $solved, $times);
vervangt door
PHP:
return fac_recursive($total, $solved, $times);
lijkt hij wel te werken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan