我有以下问题要解决,我不明白为什么我的代码无法正常工作。
编写一个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);
这个代码与问题的要求不一样,但我想这个想法是一样的。
答案 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;
}