web-dev-qa-db-ja.com

JavaScriptのフィボナッチ数列

function fib(n) {

  const result = [0, 1];
  for (var i = 2; i <= n; i++) {
    const a = (i - 1);
    const b = (i - 2);
    result.Push(a + b);
  }
  return result[n];

}

console.log(fib(8));

上記のコードの出力は13。 forループ部分がわかりません。最初の反復ではi = 2、ただし2回目の反復後i = 3 そう a = 2およびb = 1および3回目の反復i = 4 そう a = 3b = 2など...最終的なシーケンスが続く場合は、[0, 1, 1, 3, 5, 7, 9, 11]、これは誤りです。正しいシーケンスは[0, 1, 1, 2, 3, 5, 8, 13]

7
sumon

配列に既に挿入されている以前の2つの数値を使用して、配列に挿入する新しいフィボナッチ数を生成していませんでした。

https://www.mathsisfun.com/numbers/fibonacci-sequence.html

ここでは、result[i-2]result[i-1]の合計を使用して新しいフィボナッチ数を生成し、それを配列にプッシュしました。

また、n個の用語を生成するには、i < nではなくi <= nである条件が必要です。

function fib(n) {

  const result = [0, 1];
  for (var i = 2; i < n; i++) {
    result.Push(result[i-2] + result[i-1]);
  }
  return result; // or result[n-1] if you want to get the nth term

}

console.log(fib(8)); 

N番目の用語を取得する場合は、result[n-1]を返します。

7
Saif Ur Rahman

フィボナッチシリーズの私のソリューション:

 const fibonacci = n =>
      [...Array(n)].reduce(
        (acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i),
        []
      )
1

フィボナッチ数列に対して実行できる1つのアプローチは、再帰です。

var fibonacci = {
  getSequenceNumber: function(n) {
    //base case to end recursive calls
    if (n === 0 || n === 1) {
      return this.cache[n];
    }

    //if we already have it in the cache, use it
    if (this.cache[n]) {
      return this.cache[n];
    }
    //calculate and store in the cache for future use
    else {
      //since the function calls itself it's called 'recursive'
      this.cache[n] = this.getSequenceNumber(n - 2) + this.getSequenceNumber(n - 1);
    }

    return this.cache[n];
  },

  cache: {
    0: 0,
    1: 1
  }
}
//find the 7th number in the fibbonacci function
console.log(fibonacci.getSequenceNumber(7));

//see all the values we cached (preventing extra work)
console.log(fibonacci.cache);

//if you want to output the entire sequence as an array:
console.log(Object.values(fibonacci.cache));

上記のコードは、 動的プログラミング アプローチの例でもあります。 cacheメソッドによって最初に計算されたときに、各結果をgetSequenceNumberオブジェクトに格納していることがわかります。このように、getSequenceNumberが与えられた入力を見つけるように2度目に求められた場合、実際の作業を行う必要はありません-cacheから値を取得して返すだけです!これは、特定の入力の値を複数回検索する必要がある場合に、このような関数に適用できる最適化手法です。

1
Tom O.

この関数は正しくありません。関数が戻る直前にconsole.log呼び出しを追加するだけでチェックできます。

function fib(n) {

  const result = [0, 1];
  for (var i = 2; i <= n; i++) {
    const a = (i - 1);
    const b = (i - 2);
    result.Push(a + b);
  }
  console.log(result);
  return result[n];

}

console.log(fib(7));

ご覧のとおり、シーケンスが間違っており、(n = 7の場合)戻り値も間違っています。

可能な変更は次のとおりです。

function fib(n) {

  const result = [0, 1];
  for (var i = 2; i <= n; i++) {
    const a = result[i - 1];
    const b = result[i - 2];
    result.Push(a + b);
  }
  console.log(result);
  return result[n];

}

console.log(fib(8));

これは「古典的な」フィボナッチ数です。 0ではなく1の最初の数を本当に使用する場合は、配列インデックスがゼロから始まるため、return result[n-1]を使用する必要があります。

1
Cerberus
function fib(n) {
    const result = [0];

    if (n > 1) {
        result.Push(1);

        for (var i = 2; i < n; i++) {
            const a = result[result.length - 1]
            const b = result[result.length - 2];
            result.Push(a + b);
        }

    }
    console.log(result);
}
0
AYO O.

フィボナッチ数列の簡単なソリューション:

function fib(n){
    var arr = [];
    for(var i = 0; i <n; i++ ){
        if(i == 0 || i == 1){
            arr.Push(i);
        } else {
            var a = arr[i - 1];
            var b = arr[i - 2];
            arr.Push(a + b);
        }
    }
    return arr
}
console.log(fib(8))
0
patki

nインデックスのフィボナッチ値を取得するためにこのソリューションを思いつきました。

function findFac(n){
if (n===1) 
  {
   return [0, 1];
  } 
  else 
  {
    var s = findFac(n - 1);
    s.Push(s[s.length - 1] + s[s.length - 2]);
    return s;
  }
}

function findFac0(n){
var vv1 = findFac(n);
return vv1[n-1];
}


console.log(findFac0(10));
0
Viraj

これは確かに「ニワトリをきれいにするための複数の方法」タイプの状況の1つであり、このJavaScriptメソッドは私にとって有効です。

function fibCalc(n) {
    var myArr = [];

    for (var i = 0; i < n; i++) {
        if(i < 2) {
            myArr.Push(i);
        } else {
            myArr.Push(myArr[i-2] + myArr[i-1]);
        }
    } 

    return myArr;
}

fibCalc(8);

上記のように呼び出された場合、これは[0,1,1,2,3,5,8,13]を生成します。これにより、nに基づいた一連のfib番号を持つことができます。

0
ShawnTG71

ここでは、例外処理を使用せずに、引数チェックがほとんどない

function fibonacci(limit){
    if(typeof limit != "number"){return "Please enter a natural number";}

    if(limit <=0){
        return "limit should be at least 1";
    }
    else if(limit == 1){
        return [0];
    }
    else{
        var series = [0, 1];
        for(var num=1; num<=limit-2; num++){
            series.Push(series[series.length-1]+series[series.length-2]);
        }
        return series;
    }
}
0
Kiran Racherla
const fib = n => {
  const array = Array(n);
  for (i = 0; i < array.length; i++) {
    if (i > 1) {
      array[i] = array[i - 1] + array[i - 2];
    } else {
      array[i] = 1;
    }
  }
  return array;
}

console.log(fib(5))
0
Adrian Brand

間違っているのは、イテレータインデックス(i)を追加することですが、必要なのは、そのインデックスのresultに要素を追加することです。

function fib(n) {

  const result = [0, 1];

  for (let i = 2; i <= n; i++) {
    const a = result[(i - 1)];
    const b = result[(i - 2)];
    result.Push(a + b);
  }
  console.log("Result Array: " + result);
  return result[n];

}

console.log("Fibonacci Series element at 8: " + fib(8));
0
Abhishek Soni

ロジックには2つの問題があります。

  1. 変数aおよびbは、現在i - 1およびi - 2を参照しています。代わりに、result配列の要素、つまりresult[i - 1]およびresult[i - 2]を参照する必要があります。

  2. 配列の8番目の要素が必要な場合は、result[7]を呼び出す必要があります。したがって、返される値はresult[n - 1]ではなくresult[n]になります。

function fib(n) {

  const result = [0, 1];
  for (var i = 2; i < n; i++) {
    const a = result[i - 1];
    const b = result[i - 2];
    result.Push(a + b);
  }
  
  console.log(result);
  return result[n - 1];
}

console.log(fib(8));
0
Nisarg