在技术采访中的另一天,问题之一是"你如何优化Javascript代码"?
令我惊讶的是,他告诉我,虽然循环通常比循环更快.
这是真的吗?如果是,那为什么呢?
我已经制作了一个转换数字基数的程序.我认为,如果A-F输出中没有字符,将数字作为数字而不是字符串返回会很方便(即使我将基数为2的数字作为常规十进制数字返回,无论如何).
出于某种原因,当我将A3B232转换为Binary(应该是10100001101011001002 [ Wolfram | Alpha source])时,我得到了1010000110101100200.那里有两个,那不是二元的!返回值的最后一行代码是:
return (toBase <= 10) ? Number(result) : result;
Run Code Online (Sandbox Code Playgroud)
这基本上适用于所有测试,直到我决定使用上面的base-32数字.我认为我的程序正在执行除法/余数步骤不正确,所以我让它在返回值之前打印出结果.它正确地给出了1010000110101100100.所以,我Number()直接在Chrome的控制台中测试了这个方法.这就是发生的事情:
> Number("1010000110101100100")
> 1010000110101100200
Run Code Online (Sandbox Code Playgroud)
我误解了这种Number()方法的作用吗?为什么将由所有Ones和Zeroes组成的字符串转换为包含Ones,Zeroes和Twos的数字?
我已经看到几个关于生成给定斐波那契序列的帖子,比如这个.但是,我无法弄清楚如何n使用递归生成给定给定的fibonnaci数的序列(返回数组).我明显没有用,但我真的无法弄清楚如何做到这一点.
var fibArray = function(n) {
var f = [];
n < 2 ? f.push(n) : f.push(fibArray(n-1) + fibArray(n-2));
return f;
};
Run Code Online (Sandbox Code Playgroud) 之前我在Scala中使用延迟评估时提出了一个问题.我试图在Scala中编写以下Haskell函数:
fib a b = c : (fib b c)
where c = a+b
Run Code Online (Sandbox Code Playgroud)
这个问题的答案是我不能使用Lists,而应该使用Streams.现在我想在Javascript中做同样的事情.我翻译了这个功能,并在这个网站上试了一下:
function fib(a,b) {
c = a+b;
return [c] + fib(b,c);
}
var res = fib(0,1).slice(0,10);
console.log(res);
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
RangeError: Maximum call stack size exceeded
Run Code Online (Sandbox Code Playgroud)
Javascript有办法做到这一点吗?
javascript ×4
arrays ×1
built-in ×1
fibonacci ×1
haskell ×1
numbers ×1
optimization ×1
recursion ×1