代码之家  ›  专栏  ›  技术社区  ›  zero_cool

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

  •  0
  • zero_cool  · 技术社区  · 7 年前

    我正在研究一个返回大斐波那契数模的算法。我发现了一种快速高效的算法,可以使用以下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个位置。在循环体内部,还针对1的字符串表示形式对“rec”进行等式检查。有人能打破这个吗?任何洞察都将不胜感激。谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   trincot Jakube    7 年前

    这是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() toString(2) 方法将生成不带该前缀的字符串。因为python代码然后会从中去掉前3个字符(带有 [3:] ),等效的JavaScript应该只去掉一个字符(带有 slice(1) substr(1) ).

    这个 in 在Python中使用 for 循环转换为 of 在JavaScript(ES6)中。JavaScript还知道 在里面 一、

    在Python中 == 执行严格的比较。在Javascript中,需要使用 === == (非严格比较,其中1被视为等于“1”),最好使用 如果可能的话。

    关于算法

    n n 为零)。因此,该数字(和“0b”前缀)将从中删除。因此,它并不是将该字符串截断为3个字符——不,它去掉了前三个字符,即“0b1”(或“0b0”) 是零)被抛出窗外。

    一、 取剩余零和一字符串中每个字符的值。所以在每次迭代中 是“0”或“1”。名称选择 一、 一、