美文网首页js高级
斐波那契数值

斐波那契数值

作者: 椋椋夜色 | 来源:发表于2019-05-27 21:53 被阅读0次

<!DOCTYPE html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> 斐波那契数值 </title>

    <!-- 
        1 1 2 3 5 8 13 21 34 55.....

        我要写一个函数,求第n列是几
        例:如果n为6,我就要求出8

        第6列 = 第6-1列 + 第6-2列,
        算6-1列也就是第5列还要得到  5-1列 + 5-2列
        算5-1列也就是第4列还要得到  4-1列 + 4-2列
        算4-1列也就是第3列还要得到  3-1列 + 3-2列
        算3-1列也就是第2列 ,不用得了,直接得到1
        算3-2列也就是第1列,不用得了, 直接得到1
        出口是:如果是第1列或第2列,那么直接得到1
     -->

    <script>
        function fibNumber(n) {

            if (n == 1 || n == 2) {

                return 1;
            }
            return fibNumber(n - 1) + fibNumber(n - 2);
        }

        console.log(fibNumber(8)); // 21
    </script>
</head>

<body>
    <script>
        // 效率不高
        // 因为好多列在左边那个递归中肯定已经算过了,但是右边那个递归又来重复算了一次

        // 解决办法:
        // 每次算出某一列的结果先存起来,下次再来算之前,先判断它有没有算过,如果有算过,就直接把结果拿出来就行了

        var count = 0;
        var obj = {};

        function fibNumber(n) {
            count++;

            // 先看之前有没有算出来过
            if (obj[n]) {

                // 如果有直接取出来返回
                return obj[n];

            } else {

                if (n == 1 || n == 2) {

                    return 1;
                }

                obj[n] = fibNumber(n - 1) + fibNumber(n - 2);
                return obj[n];
            }
        }

        console.log("取斐波那契数值: " + fibNumber(8) + " 需要循环 " + count + " 次");
        // 取斐波那契数值: 21 需要循环 13 次
    </script>

</body>

</html>

相关文章

网友评论

    本文标题:斐波那契数值

    本文链接:https://www.haomeiwen.com/subject/wjaktctx.html