Создание суммы диапазона без циклов в JavaScript - PullRequest
2 голосов
/ 31 октября 2019

возможно ли создать сумму диапазонов в JavaScript без использования циклов? Это для увеличения скорости кода. Например:

Сумма диапазона JavaScript:

#!/usr/bin/env js60

var j = 0, k = 100000000 + 1
for(i = 0 ; i < k ; ++i) { j += i }
console.log(j)

Сумма диапазона Ruby:

#!/usr/bin/env ruby

puts (1..100_000_000_000_000_000_000_000_000_000_000_000).sum

Тесты:

  1. Диапазон сценариев Java дляСумма:
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time js60 p.js 
5000000050000000

real    0m0.531s
user    0m0.519s
sys 0m0.011s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time js60 p.js 
5000000050000000

real    0m0.514s
user    0m0.502s
sys 0m0.012s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time js60 p.js 
5000000050000000

real    0m0.558s
user    0m0.531s
sys 0m0.027s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ 
Ruby:
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time ruby q.rb 
5000000000000000000000000000000000050000000000000000000000000000000000

real    0m0.105s
user    0m0.088s
sys 0m0.017s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time ruby q.rb 
5000000000000000000000000000000000050000000000000000000000000000000000

real    0m0.122s
user    0m0.121s
sys 0m0.000s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time ruby q.rb 
5000000000000000000000000000000000050000000000000000000000000000000000

real    0m0.118s
user    0m0.094s
sys 0m0.023s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ 

Как я могу работать быстро, как Ruby в JS?

1 Ответ

2 голосов
/ 31 октября 2019

Вы можете использовать алгоритм для вычисления суммы диапазона, если хотите.

1 + 2 + 3 + 4 + ... + (x - 1) + x

эквивалентно

x * (x + 1) / 2

// Look at the result in the browser console, not the snippet console
const sum = (n) => (n * (n + 1n)) / 2n;
console.log(
  sum(
    100_000_000_000_000_000_000_000_000_000_000_000n
  )
);

Могу поспорить, что это то же самое, что делает Руби - он не подсчитывает каждое число индивидуально, он использует алгоритм суммирования.

Обратите внимание на использование BigInt, потому что 100_000_000_000_000_000_000_000_000_000_000_000 слишком велик, чтобы быть точно представленным в Javascript как number.

...