Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在elixir中增加循环中的值_Elixir - Fatal编程技术网

如何在elixir中增加循环中的值

如何在elixir中增加循环中的值,elixir,Elixir,我试图计算从范围1到范围4的每个范围内的数字的次数。范围1为1-10,范围2为11-20,范围3为21-30,范围4为31-40。我有以下资料: range1=0 range2=0 range3=0 range4=0 arr=[1,11,2,22,33,23] Enum.each arr, fn(x) -> if x >=1 and x<=10 do range1=range1+1 end if x>=11 and x<=20 do ra

我试图计算从范围1到范围4的每个范围内的数字的次数。范围1为1-10,范围2为11-20,范围3为21-30,范围4为31-40。我有以下资料:

range1=0
range2=0
range3=0
range4=0
arr=[1,11,2,22,33,23]
Enum.each arr, fn(x) ->
  if x >=1 and x<=10 do
    range1=range1+1
  end
  if x>=11 and x<=20 do
    range2=range2+1
  end
  if x>=21 and x<=30 do
    range3=range3+1
  end
  if x>=31 and x<=40 do
    range4=range4+1
  end
end 

IO.puts range1
IO.puts range2
IO.puts range3
IO.puts range4

range1=0
范围2=0
范围3=0
范围4=0
arr=[1,11,2,22,33,23]
枚举每个arr,fn(x)->
如果x>=1,x=11,x=21,x=31,x是一种不可变的语言。不能更改变量的值。永远

可以重新绑定变量,但它永远不会泄漏到外部作用域,因此您所做的基本上是在内部作用域中绑定
range
,以立即丢弃它。外部作用域中的变量(碰巧同名)永远不会更改

我们也没有循环。我们改用map/reduce

也就是说,你需要的是

Enum.reduce(
[1,11,2,22,33,23],#输入
{0,0,0,0},#初始累加器
fn x,{acc1,acc2,acc3,acc4}->
康多
x> =1和x{acc1+1,acc2,acc3,acc4}
x> =11和x{acc1,acc2+1,acc3,acc4}
x> =21和x{acc1,acc2,acc3+1,acc4}
x> =31和x{acc1,acc2,acc3,acc4+1}
结束
(完)
#⇒ {2, 1, 2, 1}
函数总是返回最后一个表达式的结果,因此我们在这里使用
cond/1
。但惯用的方法是,将累加函数的多个子句与守卫一起使用

Enum.reduce[1,11,2,22,33,23],{0,0,0},fn
x、 {acc1,acc2,acc3,acc4}当x>=1和x时
{acc1+1,acc2,acc3,acc4}
x、 当x>=11和x时{acc1,acc2,acc3,acc4}
{acc1,acc2+1,acc3,acc4}
x、 当x>=21和x时{acc1,acc2,acc3,acc4}
{acc1,acc2,acc3+1,acc4}
x、 当x>=31和x时{acc1,acc2,acc3,acc4}
{acc1,acc2,acc3,acc4+1}
结束

要获得这些值,可以选择模式匹配结果或使用

{less_that_10,{,}=
枚举减少(…)
少于10
#⇒ 2.
输入
|>枚举减少(…)
|>元素(0)
#⇒ 2
当我运行它时,它会说它们都是0。它为什么这样做

Elixir中的变量绑定到当前范围。如果绑定到函数内的变量(例如,在代码中传递给
Enum.each/2
的匿名函数),则该变量仅在该函数内可用。尽管您在匿名函数中指定了
range1
,但这与您在文件顶部定义的
range1
变量完全不同,该变量始终为
0

如何在elixir中增加循环中的值

这是错误的想法。您需要考虑的是处理列表。对于您的情况,我认为与和结合是一个很好的解决方案:

[range1,range2,range3,range4] =
   for elem <- arr, reduce: [0,0,0,0] do
     answer -> 
       update_in(answer, [Access.at!(div((elem - 1), 10))], &(&1 + 1))
   end
Enum.frequencies_by([1,11,2,22,33,23],fn
当我在1..10->:范围1
当我在11..20->:范围2
当我在21..30->:范围3
当我在31..40->:范围4
(完)
这将产生:

%{range1:2,range2:1,range3:2,range4:1}

如果我可以假设您的范围是固定的,并且您的输入大于零,我建议此解决方案:

[range1,range2,range3,range4] =
   for elem <- arr, reduce: [0,0,0,0] do
     answer -> 
       update_in(answer, [Access.at!(div((elem - 1), 10))], &(&1 + 1))
   end
[range1、range2、range3、range4]=
对于elem
更新(回答[Access.at!(div((elem-1),10))],&(&1+1))
结束

将为输出数组范围之外的索引引发异常。换句话说,输入45将生成一个4的索引,这超出了[0,0,0,0]的索引范围。

正如下面Aleksei详细介绍的那样-您需要彻底改变编程习惯以从Elixix中获益。谢谢您,这很有帮助<代码>枚举频率(按[1,11,2,22,33,23],&div(&1,10))#⇒%%{0=>2,1=>1,2=>2,3=>1}
:)我们也可以有一个宏,它在编译时获取范围并生成子句:))在更改acc1的值后,我如何访问它?我不确定我是否理解这个问题。也许是把这个值赋给一个局部变量。所以我想在之后打印acc1的新值,在reduce完成后,或者每次reduce完成后,它都是2