• Descubra o que é tail recursion (recursão na cauda), diga o que o compilador pode fazer quando ela existe, e o que acontece com uma função que é recursiva mas não tail-recursive.
  • Faça as versões listadas abaixo para as seguintes funções que fizemos em sala: insere, recupera, remove:
    • Iterativa, usando vetores para representar as listas
    • Iterativa, usando ponteiros
    • Recursiva, usando vetores
    • Recursiva, usando ponteiros
    No entanto:
    • As funções de inserção devem fazê-lo em em uma dada posição (um índice será passado como parâmetro)
    • As funções de remover e procurar devem receber a chave, retornando o objeto
    • Faça programas que testem as funções. Por exemplo, um programa que insere vários itens (em diversas posições), remova alguns, e depois procure mais alguns.
  • Escolha quatro funções que você implementou no item anterior, e mostre um diagrama do programa em execução, mostrando a pilha e o heap. (Não leve em consideração as otimizações do compilador, que você aprendeu quando fez o primeiro item deste exercício).