JS undefined

0

Witam, dlaczego metoda sumRange() zwraca mi wartość undefined?
Jak wypiszę zmienną suma to ma ona poprawną wartość, a metoda źle zwraca.

function range(first, last) {
	if (last < first) {
		return undefined;
	}

	var range = [];
	for(var i = first; i <= last; i++) {
		range.push(i);
	}

	return range;
}

var suma = 0;
function sumRange(range) {
	if(range.length === 0) {
		return suma;
	} else {
		suma += range.pop();
		sumRange(range);
	}
}

var tab = range(1, 10);

console.log(sumRange(tab)); //undefined ??? 
1

Czego oczekiwałbyś po dwukrotnym wywołaniu sumRange ?

Poprawne sumRange zakładając, że JavaScript to jakiś analog Lispa i nie mamy pętli:

function sumRange(tab) {
    var suma = 0;
    function sumRange(tab, acc) {
        if(tab.length === 0) {
            return acc;
        } else {
            acc += tab.pop();
            return sumRange(tab, acc);
        }
    }
    return sumRange(tab, suma);
}

Ale to też rak, bo pop modyfikuje tablicę. Można lepiej:

function sumRange(tab) {
    var suma = 0;
    function sumRange(tab, acc) {
        if(tab.length === 0) {
            return acc;
        } else {
            acc += tab[0]
            return sumRange(tab.slice(1), acc);
        }
    }
    return sumRange(tab, suma);
}

Edit: co do pytania to brakuje Ci return. Wchodzisz w rekursję, wydaje Ci się że zwracasz 'suma' a Ty dopiero zaczynasz odwijać stos wywołań funkcji, następna funkcja w kolejce już zwraca undefined.

0

Spoko @Saalin dzięki.
W javie to działa. Uczę się dopiero JS, a to trochę inne bajki.
Dzięki

0

Lol, w Javie to nawet się nie skompiluje przez error: missing return statement, a co dopiero o działaniu mówić.
Edit: mówię o analogicznym, równoważnym kodzie w Javie:

import java.util.*;

class Main {
  public static void main(String[] args) {
      Sth sth = new Sth();
      int[] t = new int[]{1,2,3,4,5};
      System.out.println(sth.SumRange(t));
  }
}

class Sth {
    int suma = 0;

    public int SumRange(int[] tab) {
        if(tab.length == 0) {
            return suma;
        } else {
            suma += tab[0];
            int[] arr =  Arrays.copyOfRange(tab, 1, tab.length);
            SumRange(arr); //brakuje return
        }
    }
}
0

Stary, ale ja jestem [CIACH!] -_-
Co ja tu odwaliłem xD
Już widzę tylko brak keyworda return... Wstyd.
Pisane w VIM, brak IDE robi swoje.

1

No to była część pierwszego mojego posta co do pytania. Tak czy siak nie powinieneś pisać takiego kodu, nawet z returnem, bo niepotrzebnie operujesz na globalnym stanie i niszczysz obiekty przekazywane do funkcji. Ta funkcja to one-shot, bo drugi raz w tym samym programie nie zadziała + nic co operuje na tablicy przekazanej do funkcji nie zadziała (bo nagle jej zawartość znika).

1 użytkowników online, w tym zalogowanych: 0, gości: 1