1
resposta

[Sugestão] Na recursividade a ordem da função muda o resultado

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!!

1 resposta

Oi, Gabriel! Tudo bem?

Muito obrigada por compartilhar sua observação! Realmente a ordem das cláusulas de função em Elixir pode impactar o comportamento do código, especialmente em casos de recursão. A sua contribuição é muito valiosa e com certeza ajudará outros estudantes que possam estar enfrentando problemas!

Um forte abraço e bons estudos!