zdhf数是指1、1、2、3、5、8、13、21、……这几列。 在数学上,fzdhf数列递归定义如下: F0=0、F1=1、fn=fn-1fn-2(n=2,
常用的fzdhf数列计算方法分为递归和循环两种。
递归
方法一:普通递归
代码美丽而逻辑清晰。 但是,有重复计算的问题。 例如,如果在n为5时计算Fibonacci(4) Fibonacci )3),在n为4时计算Fibonacci )3) Fibonacci )2),则Fibonacci )3)将是重复的计算运行Fibonacci(50 )时,会发生浏览器的假死现象。 毕竟需要递归堆栈,数字太大内存不够。功能光纤网络(n ) {
if(n==1||n==2) {
返回1
(;
返回光纤通道(n-2 )光纤通道(n-1 );
}
Fibonacci(30 )
方法二:改进递归-把前两位数字做成参数避免重复计算
功能光纤连接(n ) n ) )。功能光纤(n,v1,v2 ) {
if(n==1) )。
返回v1;
if(n==2) )。
返回v2;
else
返回光纤(n-1、v2、v1 v2 ) ) ) ) ) ) )。
}
返回光纤(n,1,1 ) ) ) )。
}
我是Fibonacci(30岁)
方法三:改进递归-利用闭包特性把运算结果存储在数组里,避免重复计算
虚拟光纤=函数(letmemo=[ 0,1 ];
let光纤=功能(n ) {
if (memo==未定义)
memo [ n ]=光纤(n-2光纤) n-1 ) )
}
返回记忆
}
返回光纤;
() ) ) )
Fibonacci(30 )
方法三1:改进递归-摘出存储计算结果的功能函数
变量器=函数(func ) {let memo=[];
返回函数(n ) {
if (memo==未定义)
memo=func (n
}
返回记忆
}
(;
var Fibonacci=memoizer (函数(n ) {
if(n==1||n==2) {
返回1
(;
返回光纤通道(n-2 )光纤通道(n-1 );
() )
Fibonacci(30 )
循环
方法一:普通for循环
功能光纤(n ) {var n1=1,n2=1,和;
for(letI=2; i n; I ) {2}
sum=n1 n2
n1=n2
n2=和
}
返回和
}
Fibonacci(30 )
方法二:for循环+解构赋值
虚拟光纤通道=功能(n ) )let n1=1; n2=1;
for(letI=2; i n; I ) {2}
n 1,n2]=[n2,n1 n2]
}
返回n 2
}
Fibonacci(30 )的各种方法的执行需要时间如下图所示。 常规递归改进递归for循环