V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Paperex
V2EX  ›  JavaScript

Js 求斐波那契数列第 n 项的值结果总不对

  •  1
     
  •   Paperex · 2019-04-23 09:13:45 +08:00 · 4020 次点击
    这是一个创建于 1822 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>Document</title>
    </head>
    <body>
    	<script>
    		var num = parseInt(window.prompt('input'));
    		var first = 1;
    		var second = 1;
    		var third;
    		if(num > 2){
    			for(var i = 0; i < num-2; i++){
    				third = first + second;
    				first = second;
    				second = third;
    			}
    			document.write(third);
    		}
    		else{
    			document.write(1);
    		}
    	</script>
    </body>
    </html>
    

    输出结果第 4 项为 3,第 5 项为 4.调试后发现 first 的结果总是 1,真是搞不懂,请大神帮忙看看!

    17 条回复    2019-04-23 13:10:16 +08:00
    yngby
        1
    yngby  
       2019-04-23 09:23:24 +08:00
    为啥我试了一下没错呢
    mango88
        2
    mango88  
       2019-04-23 09:24:54 +08:00 via iPhone
    第一项难道不是 1 ?
    wangsongyan
        3
    wangsongyan  
       2019-04-23 09:26:07 +08:00
    我这对的
    vexjoe
        4
    vexjoe  
       2019-04-23 09:30:03 +08:00
    wenzichel
        5
    wenzichel  
       2019-04-23 09:36:58 +08:00
    没错的呀!

    ```javascript
    function fb(num) {
    var first = 1;
    var second = 1;
    var third;
    if(num > 2){
    for(var i = 0; i < num-2; i++){
    third = first + second;
    first = second;
    second = third;
    }
    return third;
    }
    else{
    return first;
    }
    }
    for(let i=1; i<10; i++) {
    console.log(i, fb(i));
    }
    /*
    1 1
    2 1
    3 2
    4 3
    5 5
    6 8
    7 13
    8 21
    9 34
    */
    ```
    wenzichel
        6
    wenzichel  
       2019-04-23 09:37:48 +08:00
    不支持 markdown 啊,那我怎么删除我上面的这条评论呢
    DJQTDJ
        7
    DJQTDJ  
       2019-04-23 10:09:54 +08:00
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
    <script>
    var increment = 0;
    while(increment < 100) {
    var first = 1;
    var second = 1;
    var third;
    if(increment > 2){
    for(var i = 0; i < increment-2; i++){
    third = first + second;
    first = second;
    second = third;
    }
    document.write(increment + ":" + third + "<br>");
    }
    else{
    document.write(increment + ":" + 1 + "<br>");
    }
    increment++;
    }
    </script>
    </body>
    </html>

    没问题吖
    Jase
        8
    Jase  
       2019-04-23 10:18:34 +08:00
    function fibonacci(n) {
    if (n === 1) {
    return 1;
    }

    if (n === 2) {
    return 1;
    }

    return fibonacci(n - 1) + fibonacci(n - 2);
    }
    ytmsdy
        9
    ytmsdy  
       2019-04-23 10:23:10 +08:00
    @Jase 大兄弟,你这么写会爆栈的哦。。
    Paperex
        10
    Paperex  
    OP
       2019-04-23 11:00:15 +08:00
    各位大哥,是我之前把 for 循环里的“ first ”写成了“ first ”。可这帖子没法删除……。感谢各位大神!
    dartabe
        11
    dartabe  
       2019-04-23 11:22:40 +08:00
    各位大神 插一个问题 之前网上说这个数列求法最好不用递归 对 JS 是不是也成立呢?
    gosansam
        12
    gosansam  
       2019-04-23 11:35:19 +08:00   ❤️ 1
    @dartabe 爆栈了解一下
    airdge
        13
    airdge  
       2019-04-23 11:50:40 +08:00
    function F(n) {
    if (n == 1) {
    return 1
    } else if (n == 2) {
    return 1
    } else {
    return F(n - 1) + F(n - 2)
    }
    }
    console.log(F(9))
    airdge
        14
    airdge  
       2019-04-23 11:53:36 +08:00
    @airdge 没注意看评论 这种确实不行
    stevenbipt
        15
    stevenbipt  
       2019-04-23 11:55:05 +08:00 via Android
    递归写法是个狼人~
    silentstorm
        16
    silentstorm  
       2019-04-23 12:47:21 +08:00
    通项公式:(Math.pow((1+Math.sqrt(5))/2,n)-Math.pow((1-Math.sqrt(5))/2,n))/Math.sqrt(5)
    就是会有精度损失
    bzw875
        17
    bzw875  
       2019-04-23 13:10:16 +08:00
    function fibonacci(n) {
    if (n < 2) {
    return 1;
    }
    var arr = [1,1];
    for (i = 1; i < n; i++) {
    arr[i + 1] = arr[i - 1] + arr[i];
    }
    return arr[n];
    }
    console.log(fibonacci(10));
    你们要么函数栈太深,要么重复计算每个值,应该用一个数组保持每一项的值。这样比较快
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3288 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:24 · PVG 20:24 · LAX 05:24 · JFK 08:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.