为什么这段代码不能正常工作?

时间:2016-02-05 19:29:40

标签: javascript

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

  

编写一个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);

这个代码与问题的要求不一样,但我想这个想法是一样的。

1 个答案:

答案 0 :(得分: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 {
  	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?
}

上次我对速度进行了优化并且速度显着提高(仍然不能满足您的要求)。这种尝试优化了内存,因为它只存储了最后两个纤维,但速度一样快,大约在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;
}