Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Mở rộng biểu thức nhị thức trong JavaScript

Vấn đề

Chúng ta cần viết một hàm JavaScript nhận vào một biểu thức dạng (ax+b)^n với a, b là số nguyên (có thể âm hoặc dương), x là biến đơn ký tự bất kỳ, và n là số tự nhiên. Nếu a = 1, không đặt hệ số trước biến.

Hàm sẽ trả về dạng mở rộng dưới dạng chuỗi dạng ax^b+cx^d+ex^f... với a, c, e là hệ số, x là biến một ký tự gốc, b, d, f là lũy thừa giảm dần.

Ví dụ

Dưới đây là mã nguồn:

const str = '(8a+6)^4'; 
const trim = value => value === 1 ? '' : value === -1 ? '-' : value 
const factorial = (value, total = 1) => value <= 1 ? total : factorial(value - 1, total * value) 
const find = (str = '') => { 
  let [op1, coefficient, variable, op2, constant, power] = str 
    .match(/(\W)(\d*)(\w)(\W)(\d+)..(\d+)/) 
    .slice(1) 
  power = +power 
  if (!power) { 
    return '1' 
  } 
  if (power === 1) { 
    return str.match(/\((.*)\)/)[1] 
  } 
  coefficient = 
    op1 === '-' 
    ? coefficient 
    ? -coefficient 
    : -1 
    : coefficient 
    ? +coefficient 
    : 1 
  constant = op2 === '-' ? -constant : +constant 
  const factorials = Array.from({ length: power + 1 }, (_,i) => factorial(i)) 
  let result = '' 
  for (let i = 0, p = power; i <= power; ++i, p = power - i) { 
    let judge = 
      factorials[power] / (factorials[i] * factorials[p]) * 
      (coefficient * p * constant * i) 
    if (!judge) { 
      continue 
    } 
    result += p 
      ? trim(judge) + variable + (p === 1 ? '' : `^${p}`) 
      : judge 
    result += '+' 
  } 
  return result.replace(/\+\-/g, '-').replace(/\+$/, '') 
}; 
console.log(find(str));

Kết quả

576a^3+1152a^2+576a