for i in bin(n)[3:]: in Javascript 的等价物是什么?

What is the equivalent of for i in bin(n)[3:]: in Javascript?

我正在研究一种返回大斐波那契数模的算法。我找到了一种使用以下 python:

确定值的快速高效算法
def fib(n):
    v1, v2, v3 = 1, 1, 0    # initialise a matrix [[1,1],[1,0]]
    for rec in bin(n)[3:]:  # perform fast exponentiation of the matrix (quickly raise it to the nth power)
        calc = v2*v2
        v1, v2, v3 = v1*v1+calc, (v1+v3)*v2, calc+v3*v3
        if rec == '1':    
            v1, v2, v3 = v1+v2, v1, v2
    return v2 

我很想了解如何在 javascript 中实现这一点,二进制转换行让我挂了。 这里的 for 循环使用每个整数的二进制转换,我假设从 0 到 n,并将结果截断为 3 位。还有一个 'rec' 与循环体内 1 的字符串表示形式的相等性检查。有人可以打破这个吗?任何见解表示赞赏。谢谢!

这是 JavaScript (ES6) 等价物:

function fib(n) {
    let [v1, v2, v3] = [1, 1, 0]; // initialise a matrix [[1,1],[1,0]]
    for (i of (n).toString(2).slice(1)) {  // perform fast exponentiation of the matrix (quickly raise it to the nth power)
        let calc = v2*v2;
        [v1, v2, v3] = [v1*v1+calc, (v1+v3)*v2, calc+v3*v3];
        if (i === '1')
            [v1, v2, v3] = [v1+v2, v1, v2];
    }
    return v2;
}

// Demo
console.log(fib(15));

Python 和 JavaScript 版本之间的区别:

Python bin() 函数生成带有“0b”前缀的字符串,而 JavaScript toString(2) 方法将生成没有该前缀的字符串。由于 python 代码然后从中删除前 3 个字符(使用 [3:]),JavaScript 等价物应该只删除一个字符(使用 slice(1)substr(1) ).

Python 多重赋值在 JavaScript 中转换为解构赋值,这需要数组文字表示法。

Python for 循环中使用的 in 转换为 JavaScript (ES6) 中的 of。 JavaScript 也知道 in 语法,但它有不同的含义:i 然后会取索引值(从 0 开始,然后递增 1一)而不是该索引处的字符内容。

在Python中==执行严格比较。在 Javascript 中需要使用 === 进行严格比较,尽管在这种情况下它也可以与 == 一起使用(非严格比较,其中 1 被认为等于 '1') , 最好尽可能使用 ===

关于算法

请注意,转换为二进制只会发生一次:只有 n 会转换为二进制字符串。该算法不需要该二进制表示的第一个数字(它将始终为一个,除非 n 为零)。因此该数字(和“0b”前缀)被从中删除。所以它并不是将该字符串截断为 3 个字符——不,它去除了前三个字符,即“0b1”(或“0b0”,当 n 为零时)被丢弃window.

然后 i 取剩余字符串中每个字符的值。所以在每次迭代中 i 要么是'0'要么是'1'。名称选择 i 不是最好的:传统上 i 用于整数,而不是字符,但在这段代码中它是一个字符。