For loop Elixir:为生成器分配变量(变量范围?)

For loop Elixir:为生成器分配变量(变量范围?),for-loop,scope,elixir,variable-assignment,For Loop,Scope,Elixir,Variable Assignment,我正在解决 下面的Elixir代码抛出警告,并且不在if块(赋值)中求值,我认为: 如何更新(分配)数值num? (以下Python和Javascript代码用于解决同一问题): 实际上,您正在创建一个新变量,并从外部范围中隐藏该变量 你可以这样重写 num = 13195 range = num |> :math.sqrt() |> Float.floor() |> round num = 2..range |> Enum.reduce(

我正在解决

下面的Elixir代码抛出警告,并且不在if块(赋值)中求值,我认为:

如何更新(分配)数值
num
? (以下Python和Javascript代码用于解决同一问题):




实际上,您正在创建一个新变量,并从外部范围中隐藏该变量

你可以这样重写

num = 13195

range =
  num
  |> :math.sqrt()
  |> Float.floor()
  |> round

num =
  2..range
  |> Enum.reduce(num, fn elem, acc ->
    if rem(acc, elem) == 0 and div(acc, elem) != 1 do
      div(acc, elem)
    else
      acc
    end
  end)

IO.puts num
有关阴影的详细信息:

嵌套作用域中的任何变量,如果其名称与周围作用域中的变量一致,则该外部变量将被隐藏。换句话说,嵌套范围内的变量会临时隐藏周围范围内的变量,但不会以任何方式影响它


实际上,您正在创建一个新变量,并从外部范围隐藏该变量

你可以这样重写

num = 13195

range =
  num
  |> :math.sqrt()
  |> Float.floor()
  |> round

num =
  2..range
  |> Enum.reduce(num, fn elem, acc ->
    if rem(acc, elem) == 0 and div(acc, elem) != 1 do
      div(acc, elem)
    else
      acc
    end
  end)

IO.puts num
有关阴影的详细信息:

嵌套作用域中的任何变量,如果其名称与周围作用域中的变量一致,则该外部变量将被隐藏。换句话说,嵌套范围内的变量会临时隐藏周围范围内的变量,但不会以任何方式影响它


谢谢!学习使用reduce进行更新。顺便说一句,Elixir变量在(或包含所有do~end)范围内有界?谢谢!学习使用reduce进行更新。顺便说一句,Elixir变量在(或包含所有do~end)范围的
中有界?在Elixir中,变量是不可变的。可以将符号重新指定给新值,但不能更新正在枚举的变量的值。而是将更新后的值(实际上是一个新变量)传递给函数。这就是Enum.reduce在《赞美太阳》中所做的。在Elixir中,变量是不变的。可以将符号重新指定给新值,但不能更新正在枚举的变量的值。而是将更新后的值(实际上是一个新变量)传递给函数。这就是Enum.reduce在
赞美太阳
的答案中所做的。
# 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)
num = 13195

range =
  num
  |> :math.sqrt()
  |> Float.floor()
  |> round

num =
  2..range
  |> Enum.reduce(num, fn elem, acc ->
    if rem(acc, elem) == 0 and div(acc, elem) != 1 do
      div(acc, elem)
    else
      acc
    end
  end)

IO.puts num
+------------------------------------------------------------+
| Top level                                                  |
|                                                            |
|  +------------------------+     +------------------------+ |
|  | Module                 |     | Module                 | |
|  |                        |     |                        | |
|  | +--------------------+ |     | +--------------------+ | |
|  | | Function clause    | |     | | Function clause    | | |
|  | |                    | |     | |                    | | |
|  | | +----------------+ | |     | | +----------------+ | | |
|  | | | Comprehension  | | |     | | | Comprehension  | | | |
|  | | +----------------+ | |     | | +----------------+ | | |
|  | | +----------------+ | | ... | | +----------------+ | | |
|  | | | Anon. function | | |     | | | Anon. function | | | |
|  | | +----------------+ | |     | | +----------------+ | | |
|  | | +----------------+ | |     | | +----------------+ | | |
|  | | | Try block      | | |     | | | Try block      | | | |
|  | | +----------------+ | |     | | +----------------+ | | |
|  | +--------------------+ |     | +--------------------+ | |
|  +------------------------+     +------------------------+ |
|                                                            |
+------------------------------------------------------------+