【问题标题】:What is the difference between javascript and python Fibonacci code here?这里的 javascript 和 python 斐波那契代码有什么区别?
【发布时间】:2022-01-25 12:04:00
【问题描述】:

我目前正在使用矩阵乘法公式为斐波那契数列创建算法。

我基于以下 python 代码编写了我的 JavaScript 代码。但是,确认输出了另一个值 [case fib(150)]。我认为 % mod 是错误的,但是我该如何解决这个问题呢?

javascript 代码

const n = parseInt(prompt("Number"));
const mod = 1000000007;

const fib = () => {
  const zero = [
    [1, 1],
    [1, 0],
  ];
  const base = [
    [1],
    [1]
  ];

  const power = (a, num) => {
    if (num === 1) return a;
    else if (num % 2 != 0) return multi(power(a, num - 1), a);
    else return power(multi(a, a), parseInt(num / 2));
  };

  const multi = (a, b) => {
    const temp = Array.from(Array(2), () => Array(b[0].length).fill(0));

    for (let i = 0; i < 2; i++) {
      for (let j = 0; j < b[0].length; j++) {
        let sum_num = 0;
        for (let k = 0; k < 2; k++) {
          sum_num += a[i][k] * b[k][j];
        }
        temp[i][j] = sum_num % mod;
      }
    }

    return temp;
  };

  return multi(power(zero, n - 2), base)[0][0];
};

if (n === 0) {
  console.log(0);
} else if (n < 3) {
  console.log(1);
} else {
  console.log(fib());
}

python 代码

import sys
input = sys.stdin.readline
MOD = 1000000007
adj=[[1,1],[1,0]]
start=[[1],[1]]
N = int(input())

def power(adj,n):
    if n == 1:
        return adj
    elif n % 2:
        return multi(power(adj,n-1), adj)
    else:
        return power(multi(adj,adj), n//2)
    
def multi(a,b):
    temp=[[0]*len(b[0]) for _ in range(2)]
    
    for i in range(2):
        for j in range(len(b[0])):
            sum_n = 0
            for k in range(2):
                sum_n += a[i][k]*b[k][j]
            temp[i][j]= sum_n % MOD
            
    return temp

if N < 3:
    print(1)
else:
    print(multi(power(adj,N-2),start)[0][0])

【问题讨论】:

  • 尝试使用 BigInt 吗?
  • 我试试看。
  • 天哪。谢谢你,凯莉。我将其更改为 bigint 并成功。 :)
  • @momo 大多数语言,包括 JavaScript,对称为 int 的类型的范围都是有限的。 Python 没有。斐波那契数字增长得相当快:-)
  • @Stef 如果你保持% 1000000007-ing 他们就像在这里做的那样,他们不会。但是对于 JavaScript 的 floats 来说还是太多了。

标签: javascript python algorithm


【解决方案1】:

我使用 bigint 解决了它。谢谢您的帮助。 (mplungjan,凯利邦迪)

  const n = BigInt(prompt('Number'));
  const mod = 1000000007n;

  const fib = () => {
    const zero = [
      [1n, 1n],
      [1n, 0n],
    ];
    const base = [[1n], [1n]];

    const power = (a, num) => {
      if (num === 1n) return a;
      else if (num % 2n != 0) return multi(power(a, num - 1n), a);
      else return power(multi(a, a), BigInt(num / 2n));
    };

    const multi = (a, b) => {
      const temp = Array.from(Array(2), () => Array(b[0].length).fill(0));

      for (let i = 0; i < 2; i++) {
        for (let j = 0; j < b[0].length; j++) {
          let sum_num = 0n;
          for (let k = 0; k < 2; k++) {
            sum_num += a[i][k] * b[k][j];
          }
          temp[i][j] = sum_num % mod;
        }
      }

      return temp;
    };

    return multi(power(zero, n - 2n), base)[0][0];
  };

  if (n === 0) {
    console.log(0);
  } else if (n < 3) {
    console.log(1);
  } else {
    console.log(parseInt(fib()));
  }

【讨论】:

    猜你喜欢
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2012-12-29
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多