js获取菲波那契数列的第N个元素

菲波那契数列,大致可以描叙为a(n) = a(n-1) + a(n-2) (a >=2)。类似于这样[1, 1, 2, 3, 5, 8, 13 ...]。

具体大家可以百度一下。下面我们来用js获取菲波那契数列的第N个数为多少:

1.递归

var a = function(n) {
            if (n === 1 || n === 2) {
                return 1
            } else {
                return a(n - 1) + a(n - 2)
            }
        }
        console.time(‘a(44)‘)
        console.log(a(44))
        console.timeEnd(‘a(44)‘)

以上我们可以比较清晰的看出代码的思路,但是这种方法有一个致命的缺点:效率太差!

不信你看:

执行到第44个的时候,已经不能接受了。需要5s多。那我们再来改进一下

--------------------------------------------------------------------------------

2.闭包+缓存

var b = (function() {
            var cache = {
                1: 1,
                2: 1
            }
            return function(n) {
                if (cache[n]) {
                    return cache[n]
                } else {
                    cache[n - 1] = b(n - 1)
                    cache[n - 2] = b(n - 2)
                    return cache[n - 1] + cache[n - 2]
                }
            }
        })()

        console.time(‘b(1200)‘)
        console.log(b(1200))
        console.timeEnd(‘b(1200)‘)

将每一步计算出来的值,保存到了缓存中。效率提升了许多:

------------------------------------------------------------------

3.直接计算出该数列的值得数组,然后再从数组中取值

var c = function(n) {
            var arr = [1, 1]
            if (n === 1 || n === 2) {
                return 1
            }
            for (var i = 2; i < n; i ++) {
                arr[i] = arr[i - 1] + arr[i - 2]
            }
            return arr[n - 1]
        }

        console.time(‘c(1200)‘)
        console.log(c(1200))
        console.timeEnd(‘c(1200)‘)

这样效率又进一步提高了不少:

那这样还有没有更快的方法呢?当然有!菲波那契数列是有数学表达式的:

我们为何不直接使用数学表达式呢?

-----------------------------------------------------

4.直接使用数学表达式

var d = function(n) {
            return (1/(Math.pow(5, 1/2))) * (Math.pow((1 + Math.pow(5, 1/2))/2, n) - Math.pow((1 - Math.pow(5, 1/2))/2, n))
        }

        console.time(‘d(1200)‘)
        console.log(d(1200))
        console.timeEnd(‘d(1200)‘)

现在我们看一下效果:

所以总结一下:数学真美!^_^

时间: 2024-12-05 03:05:08

js获取菲波那契数列的第N个元素的相关文章

递推-练习1--noi1760 菲波那契数列(2)

递推-练习1--noi1760 菲波那契数列(2) 一.心得 二.题目 1760:菲波那契数列(2) 总时间限制:  1000ms 内存限制:  65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和.给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少. 输入 第1行是测试数据的组数n,后面跟着n行输入.每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000). 输出 n行,每行输出对应一个输入.

菲波那契数列编程实现

http://blog.csdn.net/pipisorry/article/details/37660419 斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列". fibonacci 数列定义: n = 1,2 时,fib(n) = 1 n > 2 时,fib(n) = fib(n-2) + fib(n-1) 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597,

菲波那契数列的快速幂矩阵求法

时间:2014.05.15 地点:基地二楼 ----------------------------------------------------------------------- 一.背景 著名的斐波那契数列为一个这样的序列:0 1 1 2 3 5 8 13 21 34......简单的递推公式如下: F(0)=0,F(1)=1,当n>=1时,F(n)=F(n-1)+F(n-2) 显然,我们用直接的按公式递归的算法去计算该数列的第n项效率并不高,因为这样每次递归调用我们只是将规规模缩小了

递归--练习6--noi1755菲波那契数列

递归--练习6--noi1755菲波那契数列 一.心得 二.题目 1755:菲波那契数列 总时间限制:  1000ms 内存限制:  65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和.给出一个正整数a,要求菲波那契数列中第a个数是多少. 输入 第1行是测试数据的组数n,后面跟着n行输入.每组测试数据占1行,包括一个正整数a(1 <= a <= 20) 输出 输出有n行,每行输出对应一个输入.输出应是一个正整数,为菲波那契数列中第

2017-3-5 函数 函数返回多个值 递归和菲波那契数列练习

(一)函数的定义:非常抽象,独立完成某项功能的独立个体. 作用:1提高代码的重用性 2提高功能开发的效率性 3提高程序代码的可维护性 函数分为   固定功能函数  高度抽象函数 函数的4要素:输入  输出  函数名  函数体 函数的多种形态: 1.   4要素齐全的 public static 返回值类型 函数名(需要的参数,可以多个,多种数据类型) { 函数体 return 返回返回值类型的数据 } 2.  有参数无返回值的 public ststic void 函数名(参数) { 函数体 }

1-5-13:菲波那契数列

描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和.给出一个正整数k,要求菲波那契数列中第k个数是多少. 输入输入一行,包含一个正整数k.(1 <= k <= 46)输出输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小 样例输入 19 样例输出 4181 来源1755 #include<stdio.h> int main() { int k,i,a1=1,a2=1,a=1; scanf("%d",&

菲波拉契数列(传统兔子问题)

题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 斐波那契数: 亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就

2753:菲波那契数列

2753:菲波那契数列 查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和.给出一个正整数a,要求菲波那契数列中第a个数是多少. 输入 第1行是测试数据的组数n,后面跟着n行输入.每组测试数据占1行,包括一个正整数a(1 <= a <= 20) 输出 输出有n行,每行输出对应一个输入.输出应是一个正整数,为菲波那契数列中第a个数的大小 样例输入 4 5 2

POJ 2753:菲波那契数列

AC代码: import java.util.Scanner; public class Main { /** * 利用递推得到第n个斐波拉契数 * @param n * @return */ private static int getFibonacciN(int n) { if (n > 2) { return (getFibonacciN(n - 1) + getFibonacciN(n - 2)); }else { return 1; } } public static void mai