Avatar billede axe2 Nybegynder
29. april 2002 - 17:54 Der er 10 kommentarer og
1 løsning

StackOverFlow

// denne metode laver StackOverFlow, hvorfor ?

public static int power(int x, int y)    {
int res = 0;
if(y == 0)
    res = 1;

if(y % 2 == 1)    {
  res = power(x, y - 1);
  res = x * res;
}

  else {
  int tmp1 = x * x;
  //y = y / 2;
  res = power(x * x,y / 2);
  }

return res;

}//end power
Avatar billede disky Nybegynder
29. april 2002 - 17:56 #1
fordi den kalder sig selv rekursivt.

Og JVM'ens stack derved løber tør for plads.
Avatar billede axe2 Nybegynder
29. april 2002 - 17:58 #2
ved det, men hvor ligger fejlen, den skulle ifølge en lærer virke
Avatar billede disky Nybegynder
29. april 2002 - 17:59 #3
hvad mener du ?

Det er fejlen. rekursive metoder bruger altid stack som gale.
Avatar billede axe2 Nybegynder
29. april 2002 - 18:01 #4
dvs at denne metode, selvom den er korrekt i princippet ikke duer LOL
Avatar billede disky Nybegynder
29. april 2002 - 18:04 #5
baladen er at ligegyldigt hvad du sender til metoden, kalder den altid sig selv.

I enhver rekursiv metode skal man kunne komme ud af metoden på et bestemt tidspunkt.

jeg gætter på i din første if() skal du lave en return res;

dette her virker:

    public static int power(int x, int y)
    {
        int res = 0;
        if(y == 0)
        {
            res = 1;
        }
        else if(y % 2 == 1)
        {
            res = power(x, y - 1);
            res = x * res;
        }
       
        else
        {
            int tmp1 = x * x;
            //y = y / 2;
            res = power(x * x,y / 2);
        }
       
        return res;
       
    }//end power


p.s. din lærer trænger til briller eller en udskiftning :)
Avatar billede disky Nybegynder
29. april 2002 - 18:06 #6
har testet den med

power(2,2) som korrekt giver 4 og
power(2,16) som giver 65536 som den skal.
Avatar billede disky Nybegynder
29. april 2002 - 18:08 #7
det der gik galt i din kode var at ligegyldigt hvad du kaldte metoden med ville den ALTID kalde sig selv, altså den var havnet i en uendelig løkke.

min rettelse gør at hvis y==0 så returnerer den 1, da x^0 altid giver 1. Derved slipper du ud af de rekursive kald.
Avatar billede axe2 Nybegynder
29. april 2002 - 18:08 #8
tak Disky overvejede selv dette, ja han trænger vist til et eftersyn, faktisk er dette udarbejdet udfra et eksempel fra en tekst lavet til elever DOH, sejt gået endnu engang tak
Avatar billede disky Nybegynder
29. april 2002 - 18:09 #9
Selv tak :)

Det er altid dejligt når selv læreren ikke kan se fejlen (NOT)
Avatar billede axe2 Nybegynder
29. april 2002 - 18:10 #10
jep, selv mine medstudenter, mente at jeg lavede fejl når jeg returnerede fra terminerings reglen DOOOH
Avatar billede axe2 Nybegynder
29. april 2002 - 18:13 #11
int res = 0;
if(y == 0)
    return res = 1;

if(y % 2 == 1)    {
  res = power(x, y - 1);
  res = x * res;
}

  else {
  int tmp1 = x * x;
  //y = y / 2;
  res = power(x * x,y / 2);
  }

return res;

}//end power

så er den hjemme
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
Kurser inden for grundlæggende programmering

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