5 svar
83 visningar
tangotanga 14
Postad: 11 sep 2018

Stackoverflow?

Håller på med en uppgift där jag ska skriva en rekursiv metod som tar emot en talföljd och speglar den i output. Såhär långt har jag kommit:

 

public static void reverseNumbers(){
Scanner sc = new Scanner(System.in);
if(sc.hasNextInt()){
int i = sc.nextInt();
reverseNumbers();
System.out.print(" " + i);
}
}

 

När jag anropar metoden får jag bara en massa inputs att fylla i, aldrig någon output, dvs inga "reverserade" nummer av input. Varför? Vad är fel i min kod? Är detta vad man brukar kalla Stackoverflow?

 

Tack på förhand!

Problemet här är att du lagt din inläsning inne i det rekursiva anropet, så du kommer hela tiden få ett nytt tal. Det du vill göra är att i main-metoden läsa in ditt tal från System.in, och sedan göra det första anropet till din rekursiva metod (med ett reducerat problem, annars kommer inte rekursionen göra någon nytta).

haraldfreij 683 – Mattecentrum-volontär
Postad: 11 sep 2018 Redigerad: 11 sep 2018

Grundidén med rekursiva metoder är att men för varje anrop gör problemet lite lättare. Ungefär såhär:

recursiveMethod(x){
 if (problemet är trivialt){
  lös problemet;
 }else{
  lös en liten del av problemet
  recursiveMethod(resten av problemet)
 }
}

För att ditt program ska fungera så måste du alltså komma på ett sätt att göra problemet lite enklare. Ett sätt kan vara att du vet att sista siffran i ursprungstalet ska komma först när du vänt på det, och sen kommer reverseringen av resten av talet.

tangotanga 14
Postad: 11 sep 2018

 

OK, tack så mycket för svar!

Dock vet jag ej hur jag ska forma om metoden med inläsningen i main-metoden. Vad är trivialt i detta fall? Det finns väl bara en möjlighet och det är att det blir en inläsning eller är det triviala att det inte blir någon inläsning? 

AlvinB Online 1893
Postad: 11 sep 2018

Problemet är att du tar inputen i reverseNumbers(). Eftersom reverseNumbers() anropas rekursivt kommer detta att ske flera gånger, vilket är varför allt som händer är att du får fylla i inputs. Flytta inputen utanför metoden (förslagsvis i main-metoden) så att inputen bara tas en gång.

Detta är inte ett StackOverflow-fel. Hade du inte haft inputen i loopen hade det blivit det eftersom funktionen anropas om och om igen utan att sluta, men nu tar du in input vilket stannar upp funktionen varje gång du kommer dit. (Om du knappade in siffror tillräckligt många gånger skulle det resultera i ett StackOverflow-fel, men då måste du hålla på väldigt länge).

Om du nu får ett StackOverflow-fel kommer det vara ganska tydligt eftersom det kommer stå 'StackOverflowError' i outputen.

Uppgiften handlar inte om att läsa ett tal, utan om att skriva ut ett givet tal speglat. Strunta i koden för att läsa in själva talet just nu (som jag sa ska detta ske utanför den rekursiva metoden) och fokusera på speglingen.

Förenklingssteget blir då att först skriva ut sista siffran i talet (som vi vet ska komma först i det speglade talet) och därefter spegla resten (rekursivt). Det triviala blir då om talet bara innehåller en siffra - då blir ju speglingen talet självt.

Svara Avbryt
Close