斐波那契数列 的计算规则
1 首先了解定义
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
可以得知
假设有一个数组 arr = [1,2,3,4,5,6,7,8,9…],
对应的下标是 0,1,2,3,4,5,6…
公式
F(0)=0,
F(1)=1,
F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
那么
f(0) = 0,
f(1) = 1,
f(2)= f(1)+f(0) = 1,
那么我们可以直到最重要的就是 F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
。我们可以列出一个函数来求值
第一种方法:
let fn= function f(n){
if(n == 0){
retrun 0;
}
else if( n ==1 || n ==2 ){
return 1
}
else {
return f(n-1)+f(n-2)
}
console.log(fn(9)) // 想要打印谁的值就写谁的值
}
但是这种方法智能验证到50 就开始报站了。
所以有优化的方法
那么开始我们的第二种
进行倒叙的方法计算
就是我们可以在log 里面先打印看看结果 得知没有值的时候是undefined 所有要判断是不是undefined 就好了
let arr = [0,1] //初始值我们是知道的,因为是固定的,可以直接用。
let fn = function f(n){
if(arr[n] === undefined) {
let a= f(n-1)+f(n-2);
arr[n] = a ;
// 直接赋值进去,这样就会进行计算,不过我们要知道里面的原理,因为到最后最多也就执行到1000多点就开会报站了。举个例子,加入要5的值,他是要计算4和3的,但是发现4里面没有,所以又会继续先计算3和2 的。当计算到3的时候发现没2的,又会计算2的结果,这样来回的进行套路,一层一层嵌套计算
return a;
}
else {
return arr[n]
}
}
第三种就比较优化了,不糊报错也不会报站,只是计算不出来的时候会给我们一个正无穷大的结果。
就是我们要正序算
let arr = [0, 1]
let fun = function f(n){
for (let i = 2; i<=n; i++) { // 之所以等于2,是因为从下标2开始结果开始计算的,前边都是固定的
arr [i] = arr [i-1]+ arr[i-2];
}
return arr[n]
}
就算我们输出了10000甚至更大,也不会报错了。