在 javascript 中创建没有循环的范围总和
Creating a sum of a range without loops in javascript
是否可以在不使用循环的情况下在 javascript 中创建范围总和?这是为了提高代码的速度。例如:
Java脚本范围总和:
#!/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
基准:
- 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]
└──╼⮚
如何在 JS 中像 Ruby 一样快速工作?
如果需要,您可以使用算法来计算范围的总和。
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
)
);
我打赌这与 Ruby 做的是同一类事情 - 它不会单独计算每个数字,它使用求和算法。
请注意使用 BigInt,因为 100_000_000_000_000_000_000_000_000_000_000_000
太大而无法在 Javascript 中精确表示为 number
。
是否可以在不使用循环的情况下在 javascript 中创建范围总和?这是为了提高代码的速度。例如:
Java脚本范围总和:
#!/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
基准:
- 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]
└──╼⮚
如何在 JS 中像 Ruby 一样快速工作?
如果需要,您可以使用算法来计算范围的总和。
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
)
);
我打赌这与 Ruby 做的是同一类事情 - 它不会单独计算每个数字,它使用求和算法。
请注意使用 BigInt,因为 100_000_000_000_000_000_000_000_000_000_000_000
太大而无法在 Javascript 中精确表示为 number
。