Blad z przekazywaniem tablicy do funkcji

0
function sum(array){
var rozmiar = array.length;
return (sum(range(array[0],array[rozmiar-1])));
}
var tabs=[1,2,3,4,5,6,7,8,9,10,11,12];
console.log(sum(tabs));

Napisz funkcję o nazwie range przyjmującą dwa argumenty, start i end,
i zwracającą tablicę zawierającą wszystkie liczby od start do end włącznie.
Następnie napisz funkcję sum pobierającą tablicę liczb i zwracającą ich
sumę. Wykonaj powyższy program i sprawdź, czy rzeczywiście zwróci 55.

ten pierwszy podpunkt zadania zrobiony, nie do konca rozumiem jak ogarnac drugi, ktos cos?

0

W zwróci sensie sumę liczb w tablicy?

function sum(array) {
	return array.reduce((a, b) => a + b, 0)
}
console.log(sum(tabs)) // 78

0
function range(start,end)
{
  const tablica=[];
for(var i=0;i<end-start+1;i++){
    if(i==0) {
        tablica[i]=start;
    continue;
    }
    else if (i!=0){
    tablica[i]=tablica[i-1]+1;
    continue;
    }
}
for(var i=0;i<end-start+1;i++){
    console.log(tablica[i]);
}

}

range(3,11);

to jest pierwszy podpunkt, potem mialem napisac funkcje o nazwie sum, ktora by przyjela taka tablice a nastepnie zwrocila sume wszystkich jej elementow

0
function sum(array) { return array.reduce((a, b) => a + b, 0); }

function range(min, max) {
	var list = [];
	for (var i = min; i <= max; i++) {
		list.push(i);
	}
	return list;
}	

console.log(sum(range(1, 12))); // 78 

?

1
cryptondr napisał(a):

bump

Metoda push dodaje po prostu kolejny element do tablicy. Reszta kodu funkcji range, którą podał kolega wyżej powinna być w miarę zrozumiała przy Twoim stanie wiedzy. Fakt, że przy sum to trochę więcej naczarował, ale łatwo to można przepisać do pętli for.

0

a jeszcze mam pytanie, w jaki sposob przekazywac zainicjalizowana tablice jako parametr do funkcji? moglby ktos pokazac na przykladzie?

1

Nie wiem czy dobrze Cię rozumiem, ale to właśnie funkcje zwracają tę zainicjalizowaną tablicę. Rozważ taki kod:


function dejTablice() {
  return [1,2,3];
}
console.log(dejTablice());

Tutaj jest wywołana funkcja. Ta funkcja zwraca tablicę przy pomocy słowa kluczowego return. Ten kod można zapisać też jako:

console.log([1,2,3]);

Koniec końców console log dostaje wartość, która została zainicjalizowana w funkcji powyżej.

1

chodzi mi o to, ze chcialbym przykladowo napisac taka funkcje jak Ty

function dejTablice() {
  return [1,2,3];
}
console.log(dejTablice());

ale przykladowo tak:

function dejTablice(tablica){
return tablica[1];
}

console.log(dejTablice([1,2,3]));
0

To jest zupełnie poprawny kod. W czym problem?

2

array.reduce() jest fajnie opisane na mozilli.

a jeszcze mam pytanie, w jaki sposob przekazywac zainicjalizowana tablice jako parametr do funkcji? moglby ktos pokazac na przykladzie?

Zasada jest ta sama dla każdego parametru w JS tzn.

function funckja(twoja_tablica) { 
console.log(twoja_tablica); // wypisze w konsoli: [100, 23, 123]
console.log(twoja_tablica[0]); // wypisze w konsoli: 100
}

var tablica = [100, 23, 123];
funkcja(tablica);

0

no tutaj rozumuje poprawnie, ale juz w pierwotnym kodzie, gdy przekazuje te parametry, nie dziala

function sum(array){
var rozmiar = array.length;
return (sum(range(array[0],array[rozmiar-1])));
}
var tabs=[1,2,3,4,5,6,7,8,9,10,11,12];
console.log(sum(tabs));
0
cryptondr napisał(a):

no tutaj rozumuje poprawnie, ale juz w pierwotnym kodzie, gdy przekazuje te parametry, nie dziala

function sum(array){
var rozmiar = array.length;
return (sum(range(array[0],array[rozmiar-1])));
}
var tabs=[1,2,3,4,5,6,7,8,9,10,11,12];
console.log(sum(tabs));

Czy dobrze rozumiem że bierzesz pierwszy i ostatni element tablicy (1 i 12) i z tego przedziału tworzysz nową taką samą tablicę jak pierwotna?(tablica o przedziale 1 do 12 w tym przypadku)
Bo jeżeli tak to trochę chyba mija się z celem.

return (sum(range(array[0],array[rozmiar-1])));

Nic dziwnego że nie działa gdyż twoja funkcja range() wypisuje liczby z danego przedziału a NIE zwraca je jako tablicę a ponieważ nie zwraca tablicy nie ma wartości lenght.

function range(start,end)
{
  const tablica=[];
for(var i=0;i<end-start+1;i++){
    if(i==0) {
        tablica[i]=start;
    continue;
    }
    else if (i!=0){
    tablica[i]=tablica[i-1]+1;
    continue;
    }
}
// tutaj wypisujesz zawartość tablicy z przedziałem liczb natomiast go nie zwracasz
for(var i=0;i<end-start+1;i++){
    console.log(tablica[i]);
}

// jeżeli zwrócisz tablicę to wszystko będzie działać
return tablica;
}

EDIT: Nie będzie. Nie przypatrzyłem się.
Tutaj:

function sum(array){
var rozmiar = array.length;
return (sum(range(array[0],array[rozmiar-1]))); 

W funkcji sum wywołujesz ją samą co tworzy nieskończoną "pętle".

1

czyli rozumiem warunek returna jest niepoprawny

W zasadzie to cała funkcja w tym wypadku.
Zauważ że zamiast w niej sumować listę to tylko w returnie wywołujesz ją znowu co tworzy nieskończoną "pętle" i freezeuje przeglądarke.

Dla testu spróbuj zamienić swoją funkcję sum na tę moją:

function sum(array) { return array.reduce((a, b) => a + b, 0); }

i zauważysz że nie tylko przeglądarka nie zostaje ścięta ale i program działa prawidłowo.

W sumie to naprawdę zachęcam cię to zobaczenia array.reduce bo jest to proste i intuicyjne (masz nawet przykłady użycia)

Jeżeli nie chcesz to możesz oczywiście zrobić to bez tego tylko musisz tę sumę faktycznie liczyć.

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