Olá, Alex! Espero que esteja tudo bem.
Pelo que entendi, você está tentando resolver o desafio proposto na aula de Elixir, onde a tarefa é retornar uma lista com os resultados da tabuada em vez de apenas imprimir os resultados. Analisando o código que você postou, parece que você já fez um ótimo progresso!
Vamos aprimorar um pouco mais. O problema atual é que você está tentando inserir o resultado da multiplicação no final da lista, o que não é a abordagem mais eficiente em Elixir, pois inserir no final de uma lista em Elixir é uma operação O(n). Em vez disso, você pode adicionar o resultado ao início da lista e, no final, reverter a lista para obter a ordem correta.
Aqui está uma versão modificada do seu código:
defmodule MeuModulo.Loop do
defp tabuada(_, 11), do: []
def tabuada(multiplicador) do
tabuada([], multiplicador, 1)
end
defp tabuada(lista, produto1, produto2) do
novo_elemento = produto1 * produto2
tabuada([novo_elemento | lista], produto1, produto2+1)
end
end
Neste código, a função tabuada/3
está adicionando o novo elemento no início da lista e chamando a si mesma recursivamente com a nova lista, o multiplicador e o incremento do produto2. Quando produto2 chega a 11, a função tabuada/2
é chamada devido ao pattern matching, retornando uma lista vazia. Como estamos adicionando elementos no início da lista, os elementos serão na ordem inversa. Para corrigir isso, você pode simplesmente chamar a função Enum.reverse/1
no resultado final:
defmodule MeuModulo.Loop do
defp tabuada(_, 11), do: []
def tabuada(multiplicador) do
lista = tabuada([], multiplicador, 1)
Enum.reverse(lista)
end
defp tabuada(lista, produto1, produto2) do
novo_elemento = produto1 * produto2
tabuada([novo_elemento | lista], produto1, produto2+1)
end
end
Espero ter ajudado e bons estudos!