Генерация последовательности Фибоначчи - PullRequest
23 голосов
/ 30 октября 2011
var x=0, 
var y=1;
var z;

fib[0] = 0;
fib[1] = 1;
for(i=2; i<=10; i++)
{
    alert(x+y);
    fib[i]=x+y;
    x=y;
    z=y;
}

Я пытаюсь сгенерировать простую последовательность Фибоначчи, но нет вывода. Кто-нибудь может дать мне знать, что не так?

Ответы [ 39 ]

0 голосов
/ 22 июня 2017

Лучшим вариантом было бы использование рекурсии, но следующий пример может помочь вам понять логику!

Редактировать: Исправление, рекурсия в конечном итоге истощит систему из ресурсов без архивации ожидаемых результатов.В следующем примере используется простая логика, и она может обрабатываться очень быстро ...

var sequence = [0,1];
var range = 10;

for(var i = 0; i < range-2; i++){
    sequence.push(sequence[i]+sequence[i+1]);
}

console.log(sequence);
0 голосов
/ 14 июня 2017

Нет необходимости в медленных циклах, генераторах или рекурсивных функциях (с кэшированием или без него). Вот быстрый однострочник, использующий Array и reduce.

ECMAScript 6:

var fibonacci=(n)=>Array(n).fill().reduce((a,b,c)=>a.concat(c<2?c:a[c-1]+a[c-2]),[])

ECMAScript 5:

function fibonacci(n){
    return Array.apply(null,{length:n}).reduce(function(a,b,c){return a.concat((c<2)?c:a[c-1]+a[c-2]);},[]);
}

Протестировано в Chrome 59 (Windows 10):

fibonacci(10); // 0 ms -> (10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

JavaScript может обрабатывать числа до 1476 до достижения Infinity.

fibonacci(1476); // 11ms -> (1476) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...]
0 голосов
/ 21 сентября 2016

Фибоначчи (однострочник)

function fibonacci(n) {
  return (n <= 1) ? n : fibonacci(n - 1) + fibonacci(n - 2);
}

Фибоначчи (рекурсивный)

function fibonacci(number) {
  // n <= 1
  if (number <= 0) {
    return n;
  } else {
    // f(n) = f(n-1) + f(n-2)
    return fibonacci(number - 1) + fibonacci(number - 2);
  }
};

console.log('f(14) = ' + fibonacci(14)); // 377

Фибоначчи (итеративно)

 function fibonacci(number) {
  // n < 2
  if (number <= 0) {
    return number ;
  } else {
    var n = 2; // n = 2
    var fn_1 = 0; // f(n-2), if n=2
    var fn_2 = 1; // f(n-1), if n=2   

    // n >= 2
    while (n <= number) {
      var aa = fn_2; // f(n-1)
      var fn = fn_1 + fn_2; // f(n)

      // Preparation for next loop
      fn_1 = aa;
      fn_2 = fn;

      n++;
    }

    return fn_2;
  }
};

console.log('f(14) = ' + fibonacci(14)); // 377

Фибоначчи (с Оптимизация вызовов в хвосте )

function fibonacci(number) {
  if (number <= 1) {
    return number;
  }

  function recursion(length, originalLength, previous, next) {
    if (length === originalLength)
      return previous + next;

    return recursion(length + 1, originalLength, next, previous + next);
  }

  return recursion(1, number - 1, 0, 1);
}

console.log(`f(14) = ${fibonacci(14)}`); // 377
0 голосов
/ 07 августа 2018

es6 - Функции Symbol.iterator и генератора:

let fibonacci = {
    *[Symbol.iterator]() {
        let pre = 0, cur = 1
        for (;;) {
            [ pre, cur ] = [ cur, pre + cur ]
            yield cur
        }
    }
}

for (let n of fibonacci) {
    if (n > 1000)
        break
    console.log(n)
}
0 голосов
/ 09 марта 2017

Я хотел бы добавить еще код в ответ :) Никогда не поздно написать код: P

function fibonacciRecursive(a, b, counter, len) {
    if (counter <= len) {
        console.log(a);
        fibonacciRecursive(b, a + b, counter + 1, len);
    }
}

fibonacciRecursive(0, 1, 1, 20);

Результат

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

0 голосов
/ 11 февраля 2016

Этот скрипт примет число в качестве параметра, который вы хотите, чтобы ваша последовательность Фибоначчи пошла.

function calculateFib(num) {
    var fibArray = [];
    var counter = 0;

    if (fibArray.length == 0) {
        fibArray.push(
            counter
        );
        counter++
    };

    fibArray.push(fibArray[fibArray.length - 1] + counter);

    do {
        var lastIndex = fibArray[fibArray.length - 1];
        var snLastIndex = fibArray[fibArray.length - 2];
        if (lastIndex + snLastIndex < num) {
            fibArray.push(lastIndex + snLastIndex);
        }

    } while (lastIndex + snLastIndex < num);

    return fibArray;

};
0 голосов
/ 07 ноября 2016
(function fib(max,i,j) {
  i = i||this[0];j=j||this[1];
  if (max!==0) {
    this.push(i+j);
    max--;
    return fib.bind(this, max, j, i+j)();
  } else {
    return this;
  }
}.bind([0,1], 10))();

результат: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

0 голосов
/ 25 января 2017

Еще один простой способ добиться этого:

// declare the array starting with the first 2 values of the fibonacci sequence
    var fibonacci = [0,1];
    
    function listFibonacci() {
    // starting at array index 1, and push current index + previous index to the array
        for (var i = 1; i < 10; i++) {
            fibonacci.push(fibonacci[i] + fibonacci[i - 1]);
        }
        console.log(fibonacci);
    }
    
    listFibonacci();
    
0 голосов
/ 12 февраля 2016

Вот что я придумал

//fibonacci numbers
//0,1,1,2,3,5,8,13,21,34,55,89
//print out the first ten fibonacci numbers
'use strict';
function printFobonacciNumbers(n) {
    var firstNumber = 0,
        secondNumber = 1,        
        fibNumbers = [];
    if (n <= 0) {
        return fibNumbers;
    }
    if (n === 1) {
        return fibNumbers.push(firstNumber);
    }
    //if we are here,we should have at least two numbers in the array
    fibNumbers[0] = firstNumber;
    fibNumbers[1] = secondNumber;
    for (var i = 2; i <= n; i++) {
        fibNumbers[i] = fibNumbers[(i - 1)] + fibNumbers[(i - 2)];
    }
    return fibNumbers;
}

var result = printFobonacciNumbers(10);
if (result) {
    for (var i = 0; i < result.length; i++) {
        console.log(result[i]);
    }
}
0 голосов
/ 11 октября 2016

Мои 2 цента:

function fibonacci(num) {
  return Array.apply(null, Array(num)).reduce(function(acc, curr, idx) {
    return idx > 2 ? acc.concat(acc[idx-1] + acc[idx-2]) : acc;
  }, [0, 1, 1]);
}

console.log(fibonacci(10));
...