1 svar
79 visningar
unicarl behöver inte mer hjälp
unicarl 21
Postad: 17 okt 2022 15:06 Redigerad: 17 okt 2022 15:30

Vad blir anropet med denna array

Har en uppgift där följande funktion är given:


int arrayFunc(int nrOfElements, int array[nrOfElements]) {
    if(nrOfElements == 0) {
	return 0; }
    else {
        return arrayFunc(nrOfElements - 1, &array[1]) + array[0];
    } 
}

Frågan är att besvara vad anropet

arrayFunc (6, arr)

blir om följande array är given:

int arr[] = {1, 5, 7, 4, 3, 2};

Vad är det som sker under else-satsen när funktionen kallar på sig själv igen och &array[1] sätts in. Vad betyder det?


Rubrik ändrad från "Hjälp med en uppgift" till nuvarande. En beskrivande rubrik underlättar för den som svarar, och hjälper till att skilja trådar från varandra. Läs gärna mer om rubriksättning här. /Smutstvätt, moderator 

anders_k 237
Postad: 17 okt 2022 16:16 Redigerad: 17 okt 2022 16:21

Funktionen är en s.k. rekursiv funktion, det är alltid svårt förstå (men svårare att beskriva :-)

Man använder sig av returstacken i detta exempel för att beräkna summan av heltalen i arrayen.

Så idén är att man skickar alla utom första elementet till nästa rekursiva anrop, detta gör att det hela tiden byggs upp en lång radda av additioner samtidigt som man gör arrayen mindre och mindre genom att skicka in adressen av nästa heltal (&array[1]) som används då som första element (a[0]) inne den anropade funktionen, additionen körs inte förrän man når slutet på arrayen dvs. när nrOfElements är 0.

När nrOfElements är 0 börjar själva summeringen genom att funktionerna som ropades tidigare börjar returnerar värden som då läggs ihop med den nuvarande a[0] 

Jag hoppas jag var tydlig nog, det är lättast om man debuggar ett enkelt exempel för att se vad som händer. Ett populärt sådant exempel är fakultet.

int fakultet(int n)
{
  if (n == 1) return 1;
  else return n*fakultet(n-1);
}
Svara
Close