Maison >interface Web >js tutoriel >JS implémente la séquence de Fibonacci

JS implémente la séquence de Fibonacci

黄舟
黄舟original
2017-02-10 09:49:182296parcourir

Saisissez n et trouvez le nième terme de la séquence de Fibonacci

function fibonacci(n) {
  if (n < 0) {
throw new Error('输入的数字不能小于0');
  }
  if (n == 0) {
return 0;
  } 
  if (n == 1) {
return 1;
  }
  return fibonacci(n-1) + fibonacci(n-2);
}

Ce n'est en fait pas une très bonne méthode
Par exemple, lors de la recherche de fibonacci(10), il est décomposé en fibonacci( 9) et fibonacci(8), mais fibonacci(9) sera décomposé en fibonacci(8) et fibonacci(7), dans lesquels fibonacci(8) est calculé à plusieurs reprises, et ainsi de suite. est d'enregistrer Les valeurs calculées sont les suivantes :

function fibonacci2(n) {
  if (n < 0) throw new Error('输入的数字不能小于0');
  let arr = [0, 1];
  function calc(n) {
  if (n<2) {
      return arr[n];
  }
  if (arr[n] != undefined) {
      return arr[n];
  }
  let data = calc(n-1) + calc(n-2);
  arr[n] = data;
  return data;
  }
  return calc(n);
}

function fibonacciFunc() {
  let arr = [0, 1];
  function calc(n) {
    if (n < 0) throw new Error('输入的数字不能小于0');
    if (n<2) return arr[n];
    if (arr[n] != undefined) {
      return arr[n];
    }
    let data = calc(n-1) + calc(n-2);
    arr[n] = data;
    return data;
  }

  return calc;
}   
let fibonacci3 = fibonacciFunc();

Les deux méthodes ci-dessus utilisent des fermetures

L'inconvénient de fibonacci3 est que tant que fibonacci3 n'est pas libéré, le tableau arr existera toujours dans la mémoire. Surtout après avoir calculé des nombres relativement grands ; mais lorsqu'un grand nombre de nombres de Fibonacci doivent être calculés, fibonacci3 sera plus avantageux, mais n'oubliez pas de libérer fibonacci3 à la fin, c'est-à-dire :

fibonacci3 = null;

Une autre méthode est Pas besoin de récursivité, il suffit de boucler directement

function fibonacci4 (n) {
  if (n < 0) throw new Error('输入的数字不能小于0');
  let dataMinusTwo= 0,
    dataMinusOne = 1,
    data;
  if (n == 0) return dataMinusTwo;
  if (n == 1) return dataMinusOne;
  for (var i=2;i<=n;i++) {
    data = dataMinusOne + dataMinusTwo;

    dataMinusTwo = dataMinusOne;
    dataMinusOne = data;
  }
  return data;
}

Ce qui précède est le contenu de l'implémentation JS de la séquence de Fibonacci. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn