2016-03-28 2 views
0

Я пытаюсь настроить его, то как Фибоначи работу и имеют следующий кодкак функционирует собирается позвонить

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 

Until символ новой строки, я могу Представьте, как это работает, но после этого я очень запутался.

+0

Это пустая строка на самом деле в вашем выводе или же вставить его? – usr2564301

+0

Да, я вложил пустую строку. –

ответ

4

Поскольку функция не рекурсивна, рекурсия идет влево-вправо. Мы можем подставить значения, чтобы определить, какая функция выполняется и какое значение печатается в этой точке.

fib(2) не рекурсирует на 3-ое предложение, поэтому выход будет таким, как вы ожидаете. Выход:

2 
One 
Zero 

Замены:

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

fib(3) будет рекурсию на 3 пункта, что вызывает ваш неожиданный вывод:

Выходные:

3 
2 
One 
Zero 
One 

Замены:

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 вправо? –

Смежные вопросы