【问题标题】:How would a for loop be done with Elixir recursion?如何使用 Elixir 递归完成 for 循环?
【发布时间】:2018-03-24 05:22:39
【问题描述】:

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

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 在初学者 slack 频道提出以下建议。

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

【问题讨论】:

  • 我不知道 Go - 最初的 10000000 行打印循环是做什么用的?
  • 这是我们要打印的数字。所以打印 i + 1 到 10000000。
  • 好的-现在很清楚-请参阅下面的代码。这基本上是您添加的 Martin 的更详细版本
  • 虽然 Martin 的代码确实可以在 Elixir 中运行,但 GavinBrelstaff 和 SashaFonseca 在下面提出的解决方案都是使用递归执行“for”循环的更通用的方法。

标签: elixir


【解决方案1】:

忽略主要内容并在 Iex 中运行您的长生不老药代码,我得到了一个无限上升系列的开始

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)

【讨论】:

  • 这正是我一直在寻找的,对我来说应该更容易得到。现在看到了,可以理解。谢谢
【解决方案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 循环的另一种方法是通过元编程为它创建一个构造。

【讨论】:

  • 我仍然不太了解您的版本是如何工作的,但我会努力弄清楚如何工作。谢谢
  • 这是函数式语言中带有模式匹配的基本递归。在这种情况下,您使用两个签名定义相同的函数。首先,您定义希望它完成的时间,在示例中是当第二个参数为 5 时(结果是 return param1)。在第二个 def 中,您递归调用该函数,以便它加倍 param1 并增加计数。当 count 达到 5 并再次调用该函数时,将触发第一个 def,由于它不再调用该函数,它将停止并执行指令(返回 param1)。
【解决方案3】:

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

【讨论】:

  • 已经阅读了递归文档,但我仍然发现很难做一个简单的加法循环。
  • 你想要一个列表的总和吗?已经有答案了,一个例子是这个:stackoverflow.com/questions/24728416/…
【解决方案4】:

在你的情况下,使用范围和简单的理解会很好,但如果你想专门使用递归,你可以做类似的事情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多