1. 什么是斐波拉契数列?
斐波拉契数列是一组数列,其特点是每个数都是前两个数之和。其前两个数字是0和1,接下来的数字就是相邻两个数字之和。
斐波拉契数列的前几个数字是:0、1、1、2、3、5、8、13、21、34、55等等。
2. 常规斐波拉契数列的写法
2.1 使用循环的方式
常规的斐波拉契数列写法是使用循环的方式。我们可以设定一个初始值数组,然后循环遍历计算每个数。
function fibonacci(n) {
let arr = [0, 1]
for(let i = 2; i < n + 1; i++) {
arr[i] = arr[i - 1] + arr[i - 2]
}
return arr[n]
}
console.log(fibonacci(6)) // 返回5
上面的代码中,我们定义了一个名为fibonacci的函数,它接受一个指定位置的参数n。然后,我们创建了一个初始值为[0,1]的数组,定义了一个for循环,用于计算每个斐波拉契数列的值。最后,返回位置为n的斐波拉契数。
2.2 使用递归的方式
除了使用循环的方式,我们还可以使用递归函数的方式来计算斐波拉契数列,这种方式更简单,但性能较差。
function fibonacci(num) {
if(num < 2) {
return num
}
return fibonacci(num - 1) + fibonacci(num - 2)
}
console.log(fibonacci(6)) // 返回8
上面的代码中,我们创建了一个名为fibonacci的递归函数,如果num小于2,则返回它本身。否则,使用递归调用fibonacci函数并返回它的前两个数字之和。
3. 斐波拉契数列的优化写法
3.1 使用ES6解构与迭代
我们可以使用ES6的解构与迭代,将斐波拉契数列的计算优化,使其代码更加简洁。
function fibonacci(n) {
let [a, b] = [0, 1]
while(n--) {
[a, b] = [b, a + b]
}
return a
}
console.log(fibonacci(6)) // 返回8
优化点: 使用解构与迭代的方式,不是每个数字都要放在数组中,可以节省空间。
3.2 使用矩阵计算
斐波拉契数列也可以通过矩阵计算来实现,这种方式要比其他方式更高效,但相应的代码难度也更大。
function fibonacci(n) {
const matrix = [[1, 1], [1, 0]]
const result = matrixPower(matrix, n - 1)
return result[0][0]
}
function matrixPower(matrix, n) {
if(n === 1) {
return matrix
}
if(n % 2 === 1) {
return matrixMultiply(matrixPower(matrix, n - 1), matrix)
} else {
const matrixTemp = matrixPower(matrix, n / 2)
return matrixMultiply(matrixTemp, matrixTemp)
}
}
function matrixMultiply(matrix1, matrix2) {
const result = [[0, 0], [0, 0]]
for(let row = 0; row < 2; row++) {
for(let col = 0; col < 2; col++) {
result[row][col] = matrix1[row][0] * matrix2[0][col] + matrix1[row][1] * matrix2[1][col]
}
}
return result
}
console.log(fibonacci(6)) // 返回8
优化点: 使用矩阵计算的方式,可以将时间复杂度从O(nlogn)降至O(logn)。
4. 总结
斐波拉契数列是计算机领域中的常见问题。在日常工作中,我们可以根据需要使用不同的斐波拉契数列写法。如果不需要考虑性能,我们可以选择递归函数的方式;如果需要节省空间,可以使用ES6的解构与迭代;如果需要高效地计算数列,那么使用矩阵计算的方式是最快的。