当前位置: 首页 > Web前端 > HTML

Likou'sFibonacciSequence

时间:2023-03-28 10:42:16 HTML

题目描述写一个函数,输入n,求斐波那契数列的第n项(即F(N))。斐波那契数列定义如下:F(0)=0,F(1)=1F(N)=F(N-1)+F(N-2),其中N>1。斐波那契数列从0开始,1、后面的斐波那契数是前面两个数相加得到的。如:fib(2)==1,fib(5)==5Leetcode原题地址:https://leetcode.cn/problems/...解决方法1直接recursively递归调用自己继续执行,递归停止寻找规律,直到满足某个条件Item0==0Item1==1Item2==Item1+Item0Item3==Item2+Item1Item4==Item3+Item2...Itemi==Itemi-1+Itemi-2//从第2项开始,即i>=2用递归表示法函数fib(i){if(i==0){return0}if(i==1){return1}if(i>=2){/***这句话可以理解为:fib(i)函数执行结果值等于returnfib(i-1)+fib(i-2)*即:fib(i)==fib(i-1)+fib(i-2)*符合上面的规则:itemi==Itemi-1+Itemi-2//从第2项开始,即i>=2*/returnfib(i-1)+fib(i-2)}}console.time()console.log('Fibonacci10thitem',fib(10));//55console.timeEnd()//default:0.279052734375ms我们使用timeEnd()打印出fib(10)的第十项的近似递归执行时间,发现是279毫秒。这里有点慢,举个例子:比如我们需要执行fib(4)来求第四项的值,不难发现第二项和第一项是重复计算的,比较浪费性能,所以这个方法是可以实现的,但是由于反复计算性能不是很好(所以递归的写法在里口没有传)。接下来我们看看能不能减少重复计算。思路是:计算出来的数据,不再计算,直接多路复用方案2使用对象缓存保留计算结果,方便多路复用:先预先定义一个对象,存储第0项的值和第1项,然后在计算过程中计算某一项的值,将这个值存储在对象中;如果继续计算,发现某项的值已经存储在对象中,则直接使用,如果没有存储在对象中,则继续保存一份,以备后续使用,减少重复计算,提高性能代码:letobj={0:0,//item0的值为01:1//item1的值为1}functionfib(i){if(i==0){returnobj[0]}if(i==1){returnobj[1]}/***如果i不在obj中,即i不属于obj的key,比如i==2*直接加一个新的:obj[2]=obj[1]+obj[0]*方程变换:obj[2]=fib(1)+fib(0)*依此类推:obj[i]=fib(i-1)+fib(i-2)*这个表达式的条件是从i>=2开始,也就是i不在obj的key中*所以如果不在就存一份让它在,then需要重新计算时*直接复用即可**///从第2条开始。如果没有,也就是之前没有计算过,直接在对象中保存一份,下次再用if(!(iinobj)){obj[i]=fib(i-1)+fib(i-2)console.log('查看obj对象存储的数据',obj);returnfib(i-1)+fib(i-2)}elseif(iinobj){//如果有,也就是你之前计算过,可以直接得到这个结果,用returnobj[i]}}console.log('Fibonacci',fib(6));//8打印obj对象的截图:这里也可以使用数组来缓存数据,存储一个计算出来的值,这里不再赘述。思路是一样的,你可以自己试试方案三。定义要添加到某项的变量:既然斐波那契数列是累加的,那么我们可以一直添加。当求:fib(6)的时候,我们从fib(1)开始加……当然,我们需要定义一个变量作为累加容器代码:functionfib(n){letfirstVal=0//第一项is0letsecondVal=1//第二项为1letthirdVal=null//第三项首先定义一个null,留作后续累加if(n==0){returnfirstVal}if(n==1){returnsecondVal}if(n>=2){for(leti=2;i<=n;i++){thirdVal=secondVal+firstVal//此项等于前一项加上前一项/**相当于整体向前移动一位*/firstVal=secondVal//将前一项的值赋给前一项secondVal=thirdVal//将此项的值赋给前一项console.log('Look在累加值',thirdVal);}returnthirdVal}}console.log('Fibonacci',fib(10));//55打印累计值:总结一下,好记性不如烂笔头,记录一下^_^,前面虽然记录了,后面忘记了。。。有很多方法比如求解斐波那契数列,也可以用通项公式表达式之类的。主要思路是在我们日常工作中,对于一些数据校验和数据结构处理,往往需要用到一些算法思想在里面,这样写出来的代码才优雅(安装X)