无限循环与计数器在不老长寿

Ren*_*ino 3 functional-programming elixir

我正在学习函数式编程,我想实现这样的东西.

while(true) do
  if(somethingHappensHere) {
    break
  }
  counter++
end
return counter
Run Code Online (Sandbox Code Playgroud)

如何使用elixir以功能方式完成此操作?

谢谢你.

Ale*_*kin 6

虽然在大多数函数式编程语言中,人们会使用递归来完成此任务,但Elixir特别提供了在不使用显式递归调用的情况下执行此操作的方法Enum.reduce_while/3:

Enum.reduce_while(1..100, 0, fn i, acc ->
  if condition, do: {:halt, acc}, else: {:cont, acc + i}
end)
Run Code Online (Sandbox Code Playgroud)

对于懒惰的评估,人们会使用Stream.reduce_while/3.

为了使它无限,可以使用Stream模块提供的无限生成器之一,如Stream.iterate/2:

Stream.iterate(0, &(&1+1)) |> Enum.reduce_while(0, fn i, acc ->
  if i > 6, do: {:halt, acc}, else: {:cont, acc + 1}
end)
#? 7
Run Code Online (Sandbox Code Playgroud)

为了递归,这是在Elixir中实现递归解决方案的方式:

defmodule M do
  def checker, do: & &1 <= 0
  def factorial(v, acc \\ 1) do
    if checker().(v), do: acc, else: factorial(v - 1, v * acc)
  end
end

M.factorial 6                            
#? 720
Run Code Online (Sandbox Code Playgroud)


Cli*_*int 1

不确定 Elixir 具体是什么,但你可以使用递归来实现这一点:

function myFunction(int counter)
{
  if (condition) {
    return counter
  }
  return myFunction(counter + 1)
}
Run Code Online (Sandbox Code Playgroud)

这本质上设置了一个可以无限递归(调用自身)的函数,每次传递下一个计数器值。

通过将递归调用作为函数执行的最后一件事,这被称为Elixir 支持的尾部调用递归(根据:Elixir 无限递归是否会溢出堆栈?

然后可以这样使用:

int counterValue = myFunction(0)
Run Code Online (Sandbox Code Playgroud)

该函数仅在条件为真时返回。

您还可以通过让该函数采用另一个返回 true 或 false 的函数(即执行条件检查)来使其更加通用。

正如我所说,不幸的是我不知道 Elixir 的语法,但我相信你能够弥补这个差距。