Avatar billede kongfjong Nybegynder
18. januar 2009 - 17:40 Der er 8 kommentarer og
1 løsning

Recursive function

Hej jeg skal bruge noget hjælp til at få forklaret flow'et i dette eksempel:

<html>
<head>
<script type="text/javascript">
function factorial(x)
{
  if (x <= 1)
      return 1;
 
  return x * factorial(x-1);
}
</script>

</head>
<body onload="alert(factorial(4));">

</body>
</html>

Jeg kan ikke helt lure hvorfor den alerter 24 med 4 som argument til funtionen :)
Avatar billede thesurfer Nybegynder
18. januar 2009 - 17:44 #1
Fordi den siger: 4 * 3 * 2 * 1  :-)

4 * 3 = 12
12 = 2 = 24
24 = 1 = 24

Det skrives som "n!" i matematik-sprog..
Avatar billede thesurfer Nybegynder
18. januar 2009 - 17:49 #2
Funktionen kan også skrives sådan her:

function factorial(x)
{
  for(i = x - 1; i > 1; i--) // loop'en skal afvikles, så længe tælleren ("i") er større end 1
  {
    x = x * i; // tag den nuværende værdi og gang den med tælleren
  }
  return x; // returner værdier
}
Avatar billede thesurfer Nybegynder
18. januar 2009 - 17:50 #3
Man kunne også skrive "i > 0", men da et tal ganget med "1", giver selve tallet, er der ingen grund til at afvikle loop'en igen.. det undgår man ved at skrive "i > 1"..
Avatar billede kongfjong Nybegynder
18. januar 2009 - 19:02 #4
Tak, men der hvor den glipper lidt for mig (kender godt n! :)), er nok omkring
return x * factorial(x-1); :)

Det at den kalder factorial-funktionen igen, forvirrer mig fordi kaldet kommer i return statementet. Det er jo i virkeligheden (eller i tankens verden måske rettere), lidt som en streng der bliver sat sammen løbende, kan man sige det sådan?
Avatar billede thesurfer Nybegynder
18. januar 2009 - 21:04 #5
Det er ikke en streng, det er et tal.

return x * factorial(x-1); betyder:

returner x gange hvad-end-der-kommer-retur-af-kaldet "factorial( nuværende-x-minus-en)"

Dvs, den venter faktisk på hvad end det er der kommer retur, før den returnere noget.

Men inden den overhovedet returnerer noget, bliver sammelinie kaldt, bare hvor x er blever 1-tal lavere.

Sådan bliver den ved med, indtil koden "return x * factorial(x-1);" ikke længere bliver kaldt, hvorefter den begynder at returnerer værdierne, i omvendt rækkefølge af kaldene..



Måske kan det her hjælpe:

<html>
<head>
<script type="text/javascript">

var s = "";
var t = 0;

function factorial(x)
{
  s += "x: " + x + "\n";
  if (x <= 1)
      return 1;
 
  t = x * factorial(x-1);
  s += "return: " + t + "\n";
  return t; //x * factorial(x-1);
}
</script>

</head>
<body onload="alert('Resultatet er: ' + factorial(4) + '\n\nUdregning:\n' + s);">

</body>
</html>
Avatar billede thesurfer Nybegynder
18. januar 2009 - 21:05 #6
Sammenligningen med strengen: Jo.. det kan man godt.
Avatar billede kongfjong Nybegynder
18. januar 2009 - 23:11 #7
Hehe ok, yes den har jeg endeligt fanget, et funktions-kald har altid "førsteret" frem for et return-statement :)
Avatar billede kongfjong Nybegynder
16. februar 2009 - 21:37 #8
thesurfer, lig et svar ;)
Avatar billede thesurfer Nybegynder
17. februar 2009 - 22:21 #9
Svar :)
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