2016-03-28 26 views
0

を呼び出すために起こっているか、どのようにフィボナッチの仕事と私は私ができる、改行まで機能は、私はそれを設定しようとしています

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

One 
2 
One 
Zero 
3 
2 
One 
Zero 
One 
5 

を持っ出力としてコード

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 

を以下の持っていますそれがどのように機能するかを想像してください。しかしその後は非常に混乱します。

+0

は、その空白行は、あなたの出力に実際にあるか、それを挿入したのですか? – usr2564301

+0

はい、空白行を挿入しました。 –

答えて

4

この関数は再帰的ではないため、再帰は左から右に移動します。どの関数が実行されているのか、その時点でどの値が出力されているのかを判断するために値を代入することができます。

fib(2)第3節では再帰しないので、出力は期待通りです。 出力:

2 
One 
Zero 

置換:

出力:

3 
2 
One 
Zero 
One 

置換:

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

fib(3)があなたの予期しない出力が発生する第三節、上の再帰ます

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(5)(これはかなり長いため、ここには含めません)と同じ置換を実行すると、出力があなたのものと一致することがわかります。要求されたとして

EDIT

fib(4)

出力:

4 
3 
2 
One 
Zero 
One 
2 
One 
Zero 

置換:

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 
+0

なぜ再帰的に呼び出さないのですか? –

+1

@zero_coding私は質問を理解していない、それは再帰的に呼び出しますか? – Gazler

+0

つまり、 'fib_calc(n-1)'は再帰呼び出しです。関数は0または1の右に達するまでそれらを自己呼び出すでしょうか? –

関連する問題