Avatar billede madsbt Nybegynder
02. november 2005 - 20:21 Der er 22 kommentarer og
2 løsninger

at lave en Fakultetfunktion

jeg forsøger at lave en funktion der skal udregne fakulteten af et tal. Min ide var først at lave en funktion der opstillede regnestykket fx 8*7*6*5... og derefter at lade PHP regne det ud for mig... Jeg kan godt få den til at opstille regnestykket men regne det ud kan jeg ikke få den til, nogen ideer?

Code:
<?
function fakultet($fak){
    while ($fak > 1){
        echo $fak, " * ";
        $fak = $fak - 1;
    }
    echo "1";
}


$fak2 =  fakultet(8);

echo $fak2 * 1;

?>

PS. Jeg er begynder på PHP :)
Avatar billede bromer Nybegynder
02. november 2005 - 20:28 #1
Du kan lave det på to måder:

1:

function fact($n) {
if ($n <= 1)
  return 1;
else
  return $n * fact($n-1);
}

eller

function fact($n) {
  if ($n <= 1) {
    return 1;
  } else {
  $sum = 1;
  for ($i = 2;$i <= $n; $i++) {
    $sum *= $i;
  }
}
}
Avatar billede nielle Nybegynder
02. november 2005 - 20:36 #2
Hvis du har regnestyllet som en streng så kan du bruge eval() til at udregne resultatet med:

echo eval($fak2);

Jeg vil dog heller anbefale en af de to metoder som bromer har angivet (selv om det nu havde mere logisk at kalde variablen for $produkt i stedet for $sum ;^)
Avatar billede nielle Nybegynder
02. november 2005 - 20:45 #3
Du skal imidlertid rette din egen funktion hvis det skal virke - den returnere nemlig ikke noget; med dine echo()-sætninger udskriver den bare på skærmen:

<?
function fakultet($fak){
    $produkt = "";
    while ($fak > 1)
    {
        $produkt .= $fak . " * ";
        $fak--;
    }
    $produkt .= "1";

    return $produkt;
}

$fak2 =  fakultet(8);

echo $fak2 . "<br>";
echo eval($fak2);
Avatar billede madsbt Nybegynder
02. november 2005 - 21:58 #4
@Nielle: Jeg får "Parse error: parse error, unexpected $ in /var/www/php/fakultet.php(18) : eval()'d code on line 1"

Code:
function fakultet($fak)
    {
    $produkt ="";
    while ($fak > 1){
    $produkt = $fak . " * ";
        $fak--;
    }
$produkt = "1";
    return $produkt;
}


$fak2 =  fakultet(8);
echo $fak2;
echo eval($fak2);
Avatar billede nielle Nybegynder
02. november 2005 - 21:59 #5
Prøv at udkommentere eval-linjen og se så hvad du får udskrevet.
Avatar billede bromer Nybegynder
02. november 2005 - 22:11 #6
Nielle: Ja, den skulle nok havde heddet produkt :)

Og min anden funktion mangler lige en return, men så virker den også
Avatar billede madsbt Nybegynder
02. november 2005 - 22:18 #7
Hvad mener du med udkommentere ?
Avatar billede nielle Nybegynder
02. november 2005 - 22:19 #8
Sådan:

// echo eval($fak2);
Avatar billede madsbt Nybegynder
02. november 2005 - 22:20 #9
Ja ok så får jeg kun 1 tilbage!
Avatar billede nielle Nybegynder
02. november 2005 - 22:24 #10
Denne linje:

$produkt = "1";

- skal være:

$produkt .= "1";
Avatar billede nielle Nybegynder
02. november 2005 - 22:25 #11
... og denne:

$produkt = $fak . " * ";

- skal være:

$produkt .= $fak . " * ";
Avatar billede madsbt Nybegynder
02. november 2005 - 22:25 #12
Ok ... som sagt begynder.. kan du sige hvorfor eller retter hvad det betyder at man gør det ?
Avatar billede nielle Nybegynder
02. november 2005 - 22:29 #13
$produkt .= $fak . " * ";

- er en mere kompakt måde at skrive dette på:

$produkt = $produkt . $fak . " * ";

.= operatoren er blot en af mange sådann operatore i PHP. Du kar f.eks.:

+=
-=
*=

osv. osv.

Hvis du udelader det lille magiske punktum, så sker der bare det at du overskriver det eksisterende indhold af strengen i stedet for at appende det nye til enden af den. :^)
Avatar billede madsbt Nybegynder
02. november 2005 - 22:31 #14
For at være lidt på tværs igen :): 8*7*6*5*4*3*2*1

Parse error: parse error, unexpected $ in /var/www/php/fakultet.php(16) : eval()'d code on line 1

Code:
<?
function fakultet($fak)
    {
    $produkt ="";
    while ($fak > 1){
    $produkt .= $fak . "*";
        $fak--;
    }
    $produkt .= "1";
    return $produkt;
}
$fak2 =  fakultet(8);
echo $fak2 . "<br>";
echo eval($fak2);
?>
Avatar billede pidgeot Nybegynder
02. november 2005 - 22:33 #15
måske udskifte dette:

$fak2 =  fakultet(8);
echo $fak2 . "<br>";
echo eval($fak2);

med dette?

echo fakultet(8) . eval(fakultet(8) . "<br>";

Ikke optimalt (du skal køre funktionen to gange), men man kan jo tilsyneladende ikke få evalueret indholdet af en variabel på den måde.

Det er muligt du kan sige echo eval(echo $fak2); i stedet for den sidste linie, men jeg er langt fra sikker.
Avatar billede madsbt Nybegynder
02. november 2005 - 22:36 #16
Nope det virker ikke ! Vil bare have den til at fungere :-)
Avatar billede nielle Nybegynder
02. november 2005 - 22:37 #17
eval("echo $fak2");
Avatar billede nielle Nybegynder
02. november 2005 - 22:38 #18
... eller måske skal der også et semikolon med:

eval("echo $fak2;");
Avatar billede madsbt Nybegynder
02. november 2005 - 22:39 #19
Samme besked!... hvad sker der for den kode her...
Avatar billede madsbt Nybegynder
02. november 2005 - 22:40 #20
YES!!!!
Avatar billede madsbt Nybegynder
02. november 2005 - 22:41 #21
Endelig... Nielle smid et "svar" ind så sender jeg dig nogle point
Avatar billede nielle Nybegynder
02. november 2005 - 22:44 #22
Denne metode er nu ikke specielt effektiv - jeg vil helt hlart anbefale bromer's fra 02/11-2005 20:28:18. :^)

... og et svar. :^)
Avatar billede madsbt Nybegynder
02. november 2005 - 22:45 #23
ja det kan jeg tænke mig den ikke er... men hele ideen var at jeg skulle se om jeg kunne smide noget sammen ... det effektive må komme når jeg bliver bedre :P
Avatar billede bromer Nybegynder
02. november 2005 - 23:01 #24
madsbt: Generelt skal du holde dig meget fra at skrive PHP kode som generer kode som skal gøres igennem eval(). Man skal virkelige have gang i noget der trækker tænder ud før det bliver en nødvendighed.

Og tak for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester