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 = 3
、b = 2
など...最終的なシーケンスが続く場合は、[0, 1, 1, 3, 5, 7, 9, 11]
、これは誤りです。正しいシーケンスは[0, 1, 1, 2, 3, 5, 8, 13]
配列に既に挿入されている以前の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]
を返します。
フィボナッチシリーズの私のソリューション:
const fibonacci = n =>
[...Array(n)].reduce(
(acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i),
[]
)
フィボナッチ数列に対して実行できる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
から値を取得して返すだけです!これは、特定の入力の値を複数回検索する必要がある場合に、このような関数に適用できる最適化手法です。
この関数は正しくありません。関数が戻る直前に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]
を使用する必要があります。
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);
}
フィボナッチ数列の簡単なソリューション:
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))
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));
これは確かに「ニワトリをきれいにするための複数の方法」タイプの状況の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番号を持つことができます。
ここでは、例外処理を使用せずに、引数チェックがほとんどない
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;
}
}
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))
間違っているのは、イテレータインデックス(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));
ロジックには2つの問題があります。
変数a
およびb
は、現在i - 1
およびi - 2
を参照しています。代わりに、result
配列の要素、つまりresult[i - 1]
およびresult[i - 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));