【发布时间】:2018-02-06 07:21:50
【问题描述】:
我正在解决,find the largest prime factor of the number, Project Euler problem3。
按照 Elixir 代码抛出警告,我认为不要在 if block(assigning) 中进行评估:
num = 13195
range = num
|> :math.sqrt
|> Float.floor
|> round
for dv <- 2..range do
if rem(num, dv) == 0 and div(num, dv) != 1 do
num = div(num, dv)
end
end
num
|> IO.puts
警告是:
$ elixir 3.exs
warning: variable "num" is unused
3.exs:10
warning: the result of the expression is ignored (suppress the warning by assigning the expression to the _ variable)
3.exs:10
13195
$ elixir -v
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Elixir 1.5.3
如何更新(分配)num?
(以下 Python 和 Javascript 代码适用于相同的问题):
# 3.py
from math import ceil, sqrt
num = 600851475143
for div in range(2, ceil(sqrt(num)) + 1):
if num%div == 0 and num/div != 1:
num /= div
assert int(num) == 6857
// 3.js
var num = 600851475143;
var range = Array.from({length: Math.trunc(Math.sqrt(num))}, (x, i) => i + 2)
for (const div of range) {
if (num%div === 0 && num/div != 1) {
num /= div;
}
}
var assert = require('assert');
assert(num === 6857)
【问题讨论】:
-
在 Elixir 中,变量是不可变的。您可以将符号重新分配给新值,但不能更新正在枚举的变量的值。相反,您将更新的值(实际上是一个新变量)传递给函数。这就是 Enum.reduce 在
praise the sun的回答中所做的。
标签: for-loop scope elixir variable-assignment