Elixir 函数将如何调用

Elixir 函数将如何调用,elixir,Elixir,我试图配置它,如何斐波那契工作,并有以下代码 defmodule FibSolver do def fib(n) do fib_calc(n) end defp fib_calc(0) do IO.puts "Zero" 0 end defp fib_calc(1) do IO.puts "One" 1 end defp fib_calc(n) do IO.puts n fib

我试图配置它,如何斐波那契工作,并有以下代码

defmodule FibSolver do

    def fib(n) do

        fib_calc(n)

    end

  defp fib_calc(0) do
    IO.puts "Zero"
    0
  end

  defp fib_calc(1) do
    IO.puts "One"
    1
  end

  defp fib_calc(n) do
        IO.puts n
    fib_calc(n-1) + fib_calc(n-2)
  end

end
作为我的输出

iex(10)> FibSolver.fib(5)
5
4
3
2
One
Zero

One
2
One
Zero
3
2
One
Zero
One
5

在换行之前,我可以想象它是如何工作的,但在那之后我非常困惑。

因为函数不是递归的,所以递归是从左到右的。我们可以替换这些值来确定正在执行的函数以及在该点打印的值

fib(2)
不会在第3子句中递归,因此输出与您预期的一样。 输出:

替换:

fib(2)
                          # Output 2
fib(1) + fib(0)
                          # Output One
1      + fib(0)
       i                  # Output Zero
1      + 0
1
fib(3)
                           # Output 3
fib(2) + fib(1)
                           # Output 2
fib(1) + fib(0) + fib(1)
                           # Output One
1      + fib(0) + fib(1)
                           # Output Zero
1      +  0     + fib(1)
                           # Output One
1      +  0     + 1
fib(4)
                                            # Output 4
fib(3) + fib(2)
                                            # Output 3
fib(2) + fib(1) + fib(2)
                                            # Output 2
fib(1) + fib(0) + fib(1) + fib(2)
                                            # Output One
1      + fib(0) + fib(1) + fib(2)
                                            # Output Zero
1      + 0      + fib(1) + fib(2)
                                            # Output One
1      + 0      + 1      + fib(2)
                                            # Output 2
1      + 0      + 1      + fib(1) + fib(0)
                                            # Output One
1      + 0      + 1      + 1      + fib(0)
                                            # Output Zero
1      + 0      + 1      + 1      + 0
fib(3)
将在第3个子句中递归,这将导致意外输出:

输出:

3
2
One
Zero
One
4
3
2
One
Zero
One
2
One
Zero
替换:

fib(2)
                          # Output 2
fib(1) + fib(0)
                          # Output One
1      + fib(0)
       i                  # Output Zero
1      + 0
1
fib(3)
                           # Output 3
fib(2) + fib(1)
                           # Output 2
fib(1) + fib(0) + fib(1)
                           # Output One
1      + fib(0) + fib(1)
                           # Output Zero
1      +  0     + fib(1)
                           # Output One
1      +  0     + 1
fib(4)
                                            # Output 4
fib(3) + fib(2)
                                            # Output 3
fib(2) + fib(1) + fib(2)
                                            # Output 2
fib(1) + fib(0) + fib(1) + fib(2)
                                            # Output One
1      + fib(0) + fib(1) + fib(2)
                                            # Output Zero
1      + 0      + fib(1) + fib(2)
                                            # Output One
1      + 0      + 1      + fib(2)
                                            # Output 2
1      + 0      + 1      + fib(1) + fib(0)
                                            # Output One
1      + 0      + 1      + 1      + fib(0)
                                            # Output Zero
1      + 0      + 1      + 1      + 0
如果您对fib(5)执行相同的替换(我不在这里包括它,因为它会很长),您将看到输出与您的匹配

编辑

fib(4)
根据要求:

输出:

3
2
One
Zero
One
4
3
2
One
Zero
One
2
One
Zero
替换:

fib(2)
                          # Output 2
fib(1) + fib(0)
                          # Output One
1      + fib(0)
       i                  # Output Zero
1      + 0
1
fib(3)
                           # Output 3
fib(2) + fib(1)
                           # Output 2
fib(1) + fib(0) + fib(1)
                           # Output One
1      + fib(0) + fib(1)
                           # Output Zero
1      +  0     + fib(1)
                           # Output One
1      +  0     + 1
fib(4)
                                            # Output 4
fib(3) + fib(2)
                                            # Output 3
fib(2) + fib(1) + fib(2)
                                            # Output 2
fib(1) + fib(0) + fib(1) + fib(2)
                                            # Output One
1      + fib(0) + fib(1) + fib(2)
                                            # Output Zero
1      + 0      + fib(1) + fib(2)
                                            # Output One
1      + 0      + 1      + fib(2)
                                            # Output 2
1      + 0      + 1      + fib(1) + fib(0)
                                            # Output One
1      + 0      + 1      + 1      + fib(0)
                                            # Output Zero
1      + 0      + 1      + 1      + 0

因为函数不是递归的,所以递归从左到右。我们可以替换这些值来确定正在执行的函数以及在该点打印的值

fib(2)
不会在第3子句中递归,因此输出与您预期的一样。 输出:

替换:

fib(2)
                          # Output 2
fib(1) + fib(0)
                          # Output One
1      + fib(0)
       i                  # Output Zero
1      + 0
1
fib(3)
                           # Output 3
fib(2) + fib(1)
                           # Output 2
fib(1) + fib(0) + fib(1)
                           # Output One
1      + fib(0) + fib(1)
                           # Output Zero
1      +  0     + fib(1)
                           # Output One
1      +  0     + 1
fib(4)
                                            # Output 4
fib(3) + fib(2)
                                            # Output 3
fib(2) + fib(1) + fib(2)
                                            # Output 2
fib(1) + fib(0) + fib(1) + fib(2)
                                            # Output One
1      + fib(0) + fib(1) + fib(2)
                                            # Output Zero
1      + 0      + fib(1) + fib(2)
                                            # Output One
1      + 0      + 1      + fib(2)
                                            # Output 2
1      + 0      + 1      + fib(1) + fib(0)
                                            # Output One
1      + 0      + 1      + 1      + fib(0)
                                            # Output Zero
1      + 0      + 1      + 1      + 0
fib(3)
将在第3个子句中递归,这将导致意外输出:

输出:

3
2
One
Zero
One
4
3
2
One
Zero
One
2
One
Zero
替换:

fib(2)
                          # Output 2
fib(1) + fib(0)
                          # Output One
1      + fib(0)
       i                  # Output Zero
1      + 0
1
fib(3)
                           # Output 3
fib(2) + fib(1)
                           # Output 2
fib(1) + fib(0) + fib(1)
                           # Output One
1      + fib(0) + fib(1)
                           # Output Zero
1      +  0     + fib(1)
                           # Output One
1      +  0     + 1
fib(4)
                                            # Output 4
fib(3) + fib(2)
                                            # Output 3
fib(2) + fib(1) + fib(2)
                                            # Output 2
fib(1) + fib(0) + fib(1) + fib(2)
                                            # Output One
1      + fib(0) + fib(1) + fib(2)
                                            # Output Zero
1      + 0      + fib(1) + fib(2)
                                            # Output One
1      + 0      + 1      + fib(2)
                                            # Output 2
1      + 0      + 1      + fib(1) + fib(0)
                                            # Output One
1      + 0      + 1      + 1      + fib(0)
                                            # Output Zero
1      + 0      + 1      + 1      + 0
如果您对fib(5)执行相同的替换(我不在这里包括它,因为它会很长),您将看到输出与您的匹配

编辑

fib(4)
根据要求:

输出:

3
2
One
Zero
One
4
3
2
One
Zero
One
2
One
Zero
替换:

fib(2)
                          # Output 2
fib(1) + fib(0)
                          # Output One
1      + fib(0)
       i                  # Output Zero
1      + 0
1
fib(3)
                           # Output 3
fib(2) + fib(1)
                           # Output 2
fib(1) + fib(0) + fib(1)
                           # Output One
1      + fib(0) + fib(1)
                           # Output Zero
1      +  0     + fib(1)
                           # Output One
1      +  0     + 1
fib(4)
                                            # Output 4
fib(3) + fib(2)
                                            # Output 3
fib(2) + fib(1) + fib(2)
                                            # Output 2
fib(1) + fib(0) + fib(1) + fib(2)
                                            # Output One
1      + fib(0) + fib(1) + fib(2)
                                            # Output Zero
1      + 0      + fib(1) + fib(2)
                                            # Output One
1      + 0      + 1      + fib(2)
                                            # Output 2
1      + 0      + 1      + fib(1) + fib(0)
                                            # Output One
1      + 0      + 1      + 1      + fib(0)
                                            # Output Zero
1      + 0      + 1      + 1      + 0

在输出中实际上是空白行还是插入它?是的,我确实插入了空白行。这条空白行实际上是在您的输出中还是插入了?是的,我确实插入了空白行。为什么不递归调用?@ ZoooLoad我不理解这个问题,它是递归调用的吗?我的意思是“Fibj-Calc(N-1)”是递归调用。所以函数将调用self,直到它们达到0或1,对吗?你也可以用please替换4吗?我添加了4。希望这能帮助你了解一般模式。为什么不递归调用?@zero_编码我不理解这个问题,它确实是递归调用的?我的意思是“fib_calc(n-1)”是递归调用。所以函数将调用self,直到它们达到0或1,对吗?你也可以用please替换4吗?我添加了4。希望这将有助于你的一般模式。