Создать счетчик через замыкание

261
21 июля 2017, 04:55

Есть такое задание:

Напиши функцию создания генератора sequence(start, step). Она при вызове возвращает другую функцию-генератор, которая при каждом вызове дает число на 1 больше, и так до бесконечности. Начальное число, с которого начинать отсчет, и шаг, задается при создании генератора. Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0. Генераторов можно создать сколько угодно.

Даны тесты для проверки:

var generator = sequence(10, 3);
console.log(generator()); // 10
console.log(generator()); // 13

Я создал обычный генератор:

function sequence() {
    let callNumber = 0;
    return function () {
        return ++callNumber;
    }
}
Answer 1

Половина дела сделана:

function sequence() {
    let callNumber = 0;
    return function () {
        return ++callNumber;
    }
}

Теперь согласно заданию нужно добавить два параметра

function sequence(start=0, step=1) {
    let callNumber = 0;
    return function () {
        return ++callNumber;
    }
}

для step, значение по умолчанию 1, для start = 0

Осталось только их использовать:

function sequence(start = 0, step = 1) { 
  let callNumber = start; 
  return function() { 
    var returnValue = callNumber; // значение для вывода 
    callNumber += step; // готовимся к следующему шагу 
    return returnValue; 
  } 
} 
 
var generator = sequence(10, 3); 
 
console.log(generator()); // 10 
console.log(generator()); // 13 
 
var generator2 = sequence(); 
 
console.log(generator2()); // 0 
console.log(generator2()); // 1

Вариант с настоящим генератором:

function sequence(start = 0, step = 1) { 
  function* gen(start, step) { 
    while (true) { // бесконечно генерируем значения 
      yield start; // выдаем значение  
      start += step; // готовимся к следующему шагу 
    } 
  } 
  var generator = gen(start, step); // создаем генератор с нужными параметрами 
 
  return function() { 
    return generator.next().value; // получаем значение из генератора 
  } 
} 
 
var generator = sequence(10, 3); 
 
console.log(generator()); // 10 
console.log(generator()); // 13 
 
var generator2 = sequence(); 
 
console.log(generator2()); // 0 
console.log(generator2()); // 1

Answer 2

Моё решение:

function sequence(start, step) { 
    start = start || 0; 
    step = step || 1; 
    start -= step; 
    return function() { 
        return start += step; 
    } 
} 
 
 
var generator = sequence(2, 3); 
console.log(generator()); 
console.log(generator()); 
console.log(generator());

Answer 3

Замыкания нету, зато есть собственно генератор)

function* sequence(start = 0, step = 1) { 
    start -= step; 
    while(true){ 
        yield start += step; 
    } 
} 
 
var generator = sequence(2, 3); 
console.log(generator.next().value); 
console.log(generator.next().value); 
console.log(generator.next().value);

READ ALSO
Вывод массива без запятой в конце

Вывод массива без запятой в конце

Переменная $group содержит массив, в котором нужно вывести последнюю строку без запятойДелаю это так:

242
Не ищет данные по некоторым словам

Не ищет данные по некоторым словам

Добрый день, пишу парсер xlsxПроблема вот в чем, вытащил все данные из файла, теперь нужно по ним отыскать данные в бд

247
функция setDate для дня недели

функция setDate для дня недели

Добрый деньМне необходимо получить дату следующей субботы

263
Как настроить вывод логов php в терминал ? Ubuntu 16.04

Как настроить вывод логов php в терминал ? Ubuntu 16.04

ак настроить вывод логов и ошибок php в терминал во время работы встроенного веб сервера php -S ? OS: ubuntu 1604

289