Obs: não lembro se o professor falou no vídeo, se sim perdão.
Me deparei com o cenário de organizar as funções e entrou em loop, a função de condição de parada deve ser escrita antes da função principal de recursão.
defmodule Teste do
# entrada
def rec(num) do
rec(num, 1)
end
# a condição de parada
def rec(_, 6) do
:ok
end
# recursão
def rec(num, add) do
IO.puts("#{num} + #{add} = #{num + add}")
rec(num, add + 1)
end
end
iex(1)> Teste.rec(5)
5 + 1 = 6
5 + 2 = 7
5 + 3 = 8
5 + 4 = 9
5 + 5 = 10
:ok
Colocando a condição de parada depois da principal recursão:
defmodule Teste do
# entrada
def rec(num) do
rec(num, 1)
end
# recursão
def rec(num, add) do
IO.puts("#{num} + #{add} = #{num + add}")
rec(num, add + 1)
end
# a condição de parada
def rec(_, 6) do
:ok
end
end
5 + 3415 = 3420
5 + 3416 = 3421
5 + 3417 = 3422
5 + 3418 = 3423
5 + 3419 = 3424
BREAK: (a)bort (A)bort with dump (c)ontinue (p)roc info (i)nfo
(l)oaded (v)ersion (k)ill (D)b-tables (d)istribution
a
Deseja finalizar o arquivo em lotes (S/N)? s
Para ser justo, ao fazer iex test.exs, ele avisa:
Erlang/OTP 27 [erts-15.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
warning: this clause for rec/2 cannot match because a previous clause at line 8 always matches
│
14 │ def rec(_, 6) do
│ ~~~~~~~~~~~~~~~~
│
└─ test.exs:14
Interactive Elixir (1.17.0) - press Ctrl+C to exit (type h() ENTER for help)
As vezes passa despercebido. Bons estudos!!