【问题标题】:Coursera Node.js Fibonacci implementation hangingCoursera Node.js 斐波那契实现挂起
【发布时间】:2013-06-22 22:57:38
【问题描述】:

我目前正在为 coursera 上提供的启动工程课程做计划 2

我正在使用 Amazon Web 服务和 ubuntu 实例进行编程,但我的编程一直处于挂起状态。我的 node.js 程序可能有问题,但我似乎找不到它。

此程序旨在生成前 100 个用逗号分隔的斐波那契数。

    #! /usr/bin/env node

    //calculation

    var fibonacci = function(n){
                    if(n < 1){return 0;}
                    else if(n == 1 || n == 2){return 1;}
                    else if(n > 2){return fibonacci(n - 1) + fibonacci(n-2);}
            };

    //put in array

    var firstkfib = function(k){
                    var i;
                    var arr = [];
                    for(i = 1; i <= k; i++){
                            arr.push(fibonacci(i));
                    }
            return arr

            };

    //print

    var format = function(arr){
            return arr.join(",");
            };

    var k = 100;
    console.log("firstkfib(" + k +")");
    console.log(format(firstkfib(k)));

我得到的唯一输出是

    ubuntu@ip-172-31-30-245:~$ node fib.js
    firstkfib(100)

然后程序挂起

【问题讨论】:

  • 程序没有挂起..你的循环越来越慢
  • 挂了多久?我相信这种斐波那契风格有一个 O(n^2) 。所以,对于 100 的 fib,它会在该循环中运行 10000 次。对于 99,它将非常接近另一个 10000,依此类推。

标签: javascript node.js amazon-web-services time-complexity fibonacci


【解决方案1】:

在 nodeJS 中编写密集的计算代码会导致阻塞。因为斐波那契是一个密集的计算代码,所以最终可能会阻塞。

【讨论】:

    【解决方案2】:

    我不知道您是否熟悉Time complexity 和算法分析,但是,事实证明您的程序具有指数运行时间。这基本上意味着,随着输入的增加,运行程序所需的时间呈指数增长。 (如果我的解释不是很清楚,请查看this link

    原来这种运行时间是extremely slow。例如,如果为k=1 运行您的程序需要 1 毫秒,则为k=100 运行它需要2^100 ms。原来是ridiculously big number

    无论如何,正如哲豪指出的那样,解决方案是将fib(n-1)fib(n-2) 的值保存(例如,在一个数组中),然后重用它来计算fib(n)。在how to do it观看麻省理工学院的视频讲座(前 15 分钟)。

    【讨论】:

      【解决方案3】:

      您可能想尝试在计算过程中打印出数字,而不是在最后打印出整个列表。计算可能挂在沿线的某个地方。

      另一方面,这可能是计算斐波那契数列的最低效的方法。您计算 fibonacci(n),然后计算 fibonacci(n+1),而不重用之前计算中的任何工作。你可能想回去重新考虑你的方法。有一种更快更简单的迭代方法。

      【讨论】:

        猜你喜欢
        • 2013-04-15
        • 2011-05-07
        • 2011-12-12
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        相关资源
        最近更新 更多