计算灵丹妙药中的自然数

met*_*rsk 2 elixir

我正在阅读Elixir in Action一书,我有点难以理解以下示例的工作原理.

defmodule NaturalNums do
  def print(1), do: IO.puts(1)

  def print(n) do
    print(n - 1)
    IO.puts(n)
  end
end
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

iex(2)> NaturalNums.print(3)
1
2
3
Run Code Online (Sandbox Code Playgroud)

我感到困惑的是这个模块如何从1开始向上计数而不是从3向下计数.不应该先打印3然后打印2然后打1?1是最后一个因为它停止了递归.

浏览该模块的控制流程会很有帮助

shr*_*t18 7

puts呼叫递归调用后发生print.因此,虽然传递的输入遵循命令3,2,1,但puts命令将以相反的顺序执行.粗略地说,这就是它的方式:

  1. print(3) - 原始输入
  2. print(2) - 递归调用打印(n-1)
  3. print(1) - 递归调用打印(n-1); 已达到基本情况
  4. 放(1)
  5. puts(2) - 完成print(2)调用
  6. puts(3) - 完成print(3)调用