2016-02-05 165 views
-2

我有以下问题需要解决,我不明白为什么我的代码无法正常工作。为什么此代码无法正常工作?

编写一个JavaScript函数,该函数以两个数字(开始和结束)作为输入,并在控制台上打印一个3列的HTML表格。

  • 第1列应该保存一个数字num,从开始到结束。
  • 第2列应该保留num*num
  • 如果num是斐波那契数或第“否”,第3列应该保持“是”。

该表格应该有标题为“Num”,“Square”和“Fib”的单元格。看下面的例子。

输入
输入数据来作为两个数的数组:开始和结束。输入数据将始终有效并采用所描述的格式。没有必要明确检查它。

输出
在控制台上打印上述表格,格式与下面的例子相同。不要添加额外的空间。空格和字符外壳很重要,所以请使用与以下示例中相同的内容。

约束
•输入被传递到在代码作为2个元件的阵列中发现的第一个JavaScript功能。
•数字的开始和结束是范围[1 ... 1 000 000]且开始≤结束的正整数。
•您的程序允许的工作时间:0.2秒。
•允许的内存:16 MB。

此代码是不同的问题的要求,但想法是相同的我猜。

这里是我的代码:

var fib = []; 
 
var a, b, result; 
 
a = 0; 
 
b = 1; 
 
result = b; 
 
for (var i = 1; i < 31; i++) { 
 
    result = a + b; 
 
    a = b; 
 
    b = result; 
 

 
    fib.push(result); 
 
} 
 
console.log("<table>"); 
 
console.log("<tr><th>Num</th><th>Square</th><th>Fib</th></tr>"); 
 
var start = 2; 
 
var end = 6; 
 
    function isFib(start, end) { 
 
     for (i = start; i < end; i++) { 
 
      fib.forEach(function (element) { 
 
       if (i === element) { 
 
        return "yes"; 
 
       } 
 
       else 
 
       { 
 
        return "no"; 
 
       } 
 
      }); 
 
     } 
 
    } 
 
function buildTable() { 
 
    for(var j = start; j < end; j++) { 
 
     console.log("<tr><td>" + j + "</td><td>" + j * j + "</td><td>" + isFib(start, end) + "</td></tr>"); 
 
    } 
 
} 
 
buildTable(start, end);

此代码是不是问题的要求是相同的,但这个想法是一样我猜。

+3

你为什么写HTML控制台日志? – Amy

+1

什么_“这个代码是不一样的问题的要求,但想法是相同的,我猜。”_是什么意思?你写了那个代码吗? – j08691

+0

HTML代码是一个字符串。是的,我写了这段代码,我不明白我错在哪里。 –

回答

0

这种感觉就像我在做你的家庭作业之一,但在这里你去。

var a = [1,25]; 
 

 
function fib(n){ 
 
    return n<2?n:fib(n-1)+fib(n-2); 
 
} 
 
function isFib(n){ 
 
    var tryNum = 0; 
 
    do { 
 
    \t var fibNum = fib(tryNum++); 
 
    } while (fibNum < n); 
 
    return (fibNum==n); 
 
} 
 

 
function printTable(a){ 
 
    var table = "<table><thead><tr><td>Num</td><td>Square</td><td>Fib</td></tr></thead>"; 
 
    for(var i=a[0]; i<=a[1]; i++){ 
 
    table += "<tr>"; 
 
     table += "<td>"+i+"</td>"; 
 
     table += "<td>"+(i*i)+"</td>"; 
 
     table += "<td>"+((isFib(i))?"yes":"no")+"</td>"; 
 
    table += "</tr>"; 
 
    } 
 
    table += "</table>"; 
 
    return table; 
 
} 
 

 
document.write(printTable(a));
table td { 
 
    border: 1px solid black; 
 
} 
 
thead { 
 
    background: #eee; 
 
}

这是一种改进的isFib功能存储旧的值,所以它的速度更快。计算从1到1,000,000的所有纤维仍然需要大约1秒,但其速度比以前更快。如果您尝试将其中包含1,000,000条记录的表打印到DOM,您可能会导致浏览器崩溃,因此请勿尝试。

var fibs = [1, 2]; 
 

 
function isFib(n) { 
 
    if (fibs[fibs.length - 1] < n) { // not calculated to n yet 
 
    do { 
 
     fibs.push(fibs[fibs.length - 1] + fibs[fibs.length - 2]); // get next fib 
 
    } while (fibs[fibs.length - 1] < n); // do until found to (or above) n 
 
    } 
 
    return (fibs.indexOf(n) > -1); // Is n in the list of fibs? 
 
}

我最后一次优化,它的速度,获得了相当高的速度(仍然为您的要求不够快)。这种尝试优化了内存,因为它只存储了最后两个fib,但速度一样快,运行时间约1秒。

function printTable(a){ 
 
    var previousFib = 1; 
 
    var currentFib = 2; 
 
    function nextFib(){ 
 
    var temp = currentFib; 
 
    currentFib += previousFib; 
 
    previousFib = temp; 
 
    } 
 

 
    var table = "<table><thead><tr><td>Num</td><td>Square</td><td>Fib</td></tr></thead>"; 
 
    for(var i=a[0]; i<a[1]; i++){ 
 
    table += "<tr>"; 
 
     table += "<td>"+i+"</td>"; 
 
     table += "<td>"+(i*i)+"</td>"; 
 
     table += "<td>"; 
 
     if(i==0||i==1) table += "yes"; 
 
     else { 
 
     while (currentFib < i){ 
 
      nextFib(); 
 
      console.log(currentFib); 
 
     } 
 
     table += (currentFib==i)?"yes":"no"; 
 
     } 
 
     table += "</td>"; 
 
    table += "</tr>"; 
 
    } 
 
    table += "</table>"; 
 
    return table; 
 
}

+0

我假设你可以自己做所有的格式来让它看起来像你的教授所要求的,但是这应该会给你正确的结果。 –

+0

我想我可以通过使用先前找到的斐波纳契数字来计算更高价值的数字,而不是重新计算每个数字,从而提高性能。如果这从1 - 1,000,000建议我相信它将需要超过0.2秒。你可能需要做一些优化。 –

+0

好吧,我试图从1-10,000运行它,它需要几分钟。我会尝试优化它在0.2秒内运行。 –

相关问题