Javascript Фибоначчи, используя замыкания - PullRequest
2 голосов
/ 07 февраля 2011

Я должен написать некоторый код, используя Javascript. Вот что мы должны сделать:

"Реализация javascript чисел Фибоначчи с использованием замыканий. В частности, напишите функцию, которая хранит два последовательных числа Фибоначчи, изначально 0 и 1. Функция также определяет и возвращает вложенную функцию getNext (). Функция getNext () обновляет два запоминает числа Фибоначчи для следующих двух чисел Фибоначчи и возвращает текущее. Например, при первом вызове getNext () возвращаемое значение равно 0, при следующем вызове оно равно 1, затем снова 1, затем 2 и т. д. "

Я вроде это понимаю, но не совсем. Может кто-нибудь, возможно, поможет уточнить? Спасибо!

Ответы [ 3 ]

8 голосов
/ 07 февраля 2011

Основная идея замыканий заключается в том, что, поскольку доводчики связывают все локальные данные по значению, вы можете использовать их для инициализации, а затем изменения переменных, которые являются только локальными для этого «экземпляра» сгенерированной функции.

Поскольку это похоже на домашнюю работу, я собираюсь ответить на другой вопрос, используя замыкания: используйте замыкания, чтобы получить идеальные квадраты (1, 4, 9 и т. Д.), По одному за раз.

function makeSquareIteratorFunction() {
  var squareRoot = 1;

  var getNext = function() {
    // Calculate the number you need to return
    var square = squareRoot * squareRoot;

    // Apply side effects. In this case just incrementing the counter, but with
    // Fibonacci you will need to be a little more creative :-)
    // You might also prefer to do this first. Depends on your approach.
    squareRoot = squareRoot + 1;

    // Return the value
    return square;
  };

  // Return the function object, which can then be called later
  return getNext;
}

// Usage
var getNextSquare = makeSquareIteratorFunction();
alert(getNextSquare()); // 1
alert(getNextSquare()); // 4
alert(getNextSquare()); // 9

ТеперьСтоит отметить, что локальные переменные, определенные во внешней функции (makeSquareIteratorFunction), локализованы и связаны с замыканием.Так что, если вы позвоните makeSquareIteratorFunction() несколько раз, последующие будут независимы от первого:

var getNextSquare1 = makeSquareIteratorFunction();
alert(getNextSquare1()); // 1
alert(getNextSquare1()); // 4
var getNextSquare2 = makeSquareIteratorFunction();
alert(getNextSquare2()); // 1 (!) because it's a new closure, initialized the same way
alert(getNextSquare1()); // 9 (!) because it was "on" 4 last time

Надеюсь, это поможет объяснить это немного?Если нет, оставьте комментарий.: -)

3 голосов
/ 20 апреля 2017

Я просто хотел опубликовать немного более актуальный ответ - закрытие Фибоначчи более читабельно написано с использованием современного JavaScript

function fibonacci() {
    let x = 0;
    let y = 1;
    let z = 0;
    return function getNext() {
        [z, x, y] = [x, y, x + y];
        return z;
    };
}

let fun = fibonacci();

for (let i = 0; i < 10; i++) {
    console.log(fun());
}
1 голос
/ 11 марта 2013
    var fibonacci = (function () {
        var arr = [0, 1];
        return function () {
            var num = arr[arr.length - 1],
                len = arr.length;
            arr.push(arr[len - 1] + arr[len - 2]);
            return num;
        };
    }());

    //test
    var i;
    for (i = 0; i < 10; i++) {
        console.log(fibonacci());
    }
   //1,1,2,3,5,8,13,21,34,55

См. Описание в http://sarathsaleem.github.com/JavaScriptTasks/

Я сделал это как ответ на этот вопрос Напишите функцию, которая будет возвращать вас сначала два раза 1, затем 2, затем 3, затем 5 и так далее (числа Фибоначчи). Не используйте глобальные переменные.

...