1
resposta

Solução do desafio

defmodule MeuModulo.Loop do

    defp tabuada(lista, _, 11), do: lista

    def tabuada(lista, multiplicador) do 
        tabuada(lista, multiplicador, 1)
    end

    defp tabuada(lista, produto1, produto2) do  
        lista |> List.insert_at(-1, produto1*produto2) |> tabuada(produto1, produto2+1)
    end
end
1 resposta

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!