如何使用Elixir递归完成for循环?

时间:2016-02-15 08:14:53

标签: elixir

我有一个简单的Go for循环,我想学习如何在Elixir中使用Recursion。我现在还不知道递归循环是如何工作的,但我正在研究这个部分!我也不知道这是否是做递归函数的正确方法。

package main

import "fmt"

func main() {
    for i := 0; i < 10000000; i++ {
        fmt.Println(i)
    }
}



defmodule Looping do
      def loops(i, e) when e <= 0 do
        IO.puts i + e
      end

      def loops(i, e) do
        IO.puts i + e
        loops(i, e + 1)
      end
    end 

    Looping.loops(1, 1) 

进入Elixir时产生1 + 1 + 1。

Martin在初学者松弛频道建议以下内容。

 1..1_000_000 |> Enum.each(&IO.puts/1)

4 个答案:

答案 0 :(得分:2)

在Iex中忽略主要内容并运行elixir代码我得到一个无限升序系列开始

1
2
3
4

这表明当你到达10000000而不是零时你可能打算停止 - 从而整理你的代码:

defmodule Looping do
  def loops(e) when e == 10000000 do
    IO.puts e
  end

  def loops(e) do
    IO.puts e
    loops(e + 1)
  end
end 

Looping.loops(0)

答案 1 :(得分:2)

我不确定你要找的是什么,但是在Elixir中使用递归模拟for循环看起来像这样:

def my_func(param1, 5), do: param1
def my_func(param1, count) do 
  my_func param1 * 2, count + 1
end

你可以调用这样的函数来运行从1到5的循环:

my_func(input_for_param1, 1)

我认为您的问题是您仍然不了解递归是什么以及Elixir(和函数式编程语言)如何工作。尝试首先掌握这些概念(包括模式匹配),一切都会变得更加容易。

执行for循环的另一种方法是通过元编程为它创建一个构造。

答案 2 :(得分:0)

这里有很多简单的递归示例:http://elixir-lang.org/getting-started/recursion.html这也解释了递归和遍历列表。你具体追求什么?看看那些,如果你很难搞清楚,请告诉我。

答案 3 :(得分:0)

在您的情况下使用范围&amp;一个简单的理解可以很好地工作,但如果你想特别使用递归,你可以做类似

的事情
defmodule SomeName do
    def addr(range), do: addr(Enum.to_list(range), 0)
    def addr([first|rest], sum), do: addr(rest, sum + first)
    def addr([], sum), do: sum
end

如果你想打印每一行你可以在addr / 2中抛出一个IO.inspect / 1来打印出这样的总和

def addr([first|rest], sum) do
  IO.inspect(sum)
  addr(rest, sum + first)
end