Funkcja zwracająca kolejne całkowite wartości z zadanego zakresu

0

Witam,
Mam za zadanie napisać funkcję, która przyjmuje dwa parametry - będące początkiem i końcem zakresu liczb całkowitych. Następnie funkcja ta ma zwracać kolejne całkowite wartości z tego zakresu lub NaN w przypadku jego przekroczenia.
Na przykład: Dla argumentów 4 i 6 kolejne wywołania zwróconej funkcji mają zwracać 4, 5, 6, NaN.
Dla argumentów 9 i 7 kolejno będą zwracane wartości 9, 8, 7, NaN.
Napisałem taką funkcje:

function zadanie2(a, b){
	var count = a;
	return function(){
		if(a < b){
			if(count > b){
				console.log("PozaZakresem");
			}
			else{
				console.log(count);
				count++;
			}	
		}
		else if(a > b){
			if(count < b){
				console.log("PozaZakresem");
			}
			else{
				console.log(count);
				count--;
			}
		}
	}
}

Wywołuje ją:

var count = zadanie2(3, 5);
			count(3, 5);
			count(3, 5);
			count(3, 5);
			count(3, 5);
			count(3, 5);
			count(3, 5);

W rezultacie otrzymuje: 3, 4, 5, PozaZakresem, PozaZakresem, PozaZakresem
Nie wiem, dobrze rozwiązałem to zadanie? W jaki sposób ma niby "po wyjsciu z zakresu zwracac NaN"?

2

Nie, nie jest to prawidłowo rozwiązane zadanie, masz zwracać wartości nie je wyświetlać. Poza tym po co wywołujesz count(3, 5) z argumentami, jak funkcja nie przyjmje argumentów? No i schodzenie w dół nie jest zawarte w treści zadania.

Ja bym to rozwiązał tak:

function createIterator (start, stop) {
  if (start > stop) {
    throw new Error('Incorrect range')
  }
  
  return function() {
    if (start > stop) {
      return NaN
    }

    return start++
  }
}


// example:

const iterate = createIterator(3, 5)

console.log(
  iterate(),
  iterate(),
  iterate(),
  iterate(),
  iterate()
)

lub krócej

function createIterator (start, stop) {
  if (start > stop) {
    throw new Error('Incorrect range')
  }
  
  return () => (start > stop ? NaN : start++)
}

CodePen: https://codepen.io/caderek/pen/oeQbMM?editors=0011

PS
Jeśli jednak potrzeba iterować w dwie strony, to wiesz jak.

0

@Maciej Cąderek
Dzięki wielkie za pomoc, a jeszcze zapytam przy okazji, bo dopiero uczę się JS'a. Jak to jest z tym JS'em, bo ja robie ogolnie tak jak cos pisze:
Tworze dwa pliki: index.html i main.js
W tym main.js umieszczam wszystkie funkcje, a w tym index.html w body daje:

<script type="text/javascript"></script>

W tym wrzucam jakies kodziwo + wywolania funkcji. Dobrze to robie? Ogolnie koduje poki co w Notepad++ sam nie wiem czy to dobry pomysl.

2

Na początek taka szczątkowa organizacja kodu może być, póki robisz małe rzeczy (choć czemu nie zrobić dwóch plików js zamiast pakować część w html?).

Ogólnie najlepszy sposób na organizację kod to moduły, najlepiej te z ES6, ale z racji tego, że rzeglądarki ich jeszcze natywnie nie wspierają i trzeba dokładać etap transpilacji nie polecałbym tego na początek. Możesz natomiast zastosowć inne sposoby na zachowanie jakotakiej modularności, począwszy od prostych modułów na literałach obiektowych po różne warianty module pattern: https://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

Kolejną sprawą jest to gdzie wywoływać funkcje, jak dzielić odpowiedzialności w kodzie i jak dzielić program na warstwy. Proponuję poczytać sobie o tym w wolnej chwili, ale przede wszystkim pisać dużo kodu, testować różne opcje, sparzyć się kilka razy, zaplątać w spaghetti kodzie - bo jak tak na sucho będziesz czytał, to nie zrozumiesz potrzeby stosowania takich czy inych konstrukcji.

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