Recursão e caso base, memoização e programação dinâmica, análise de complexidade com notação Big O, algoritmos de ordenação e seleção (quicksort e quickselect), estruturas de dados e aplicações práticas em listas, strings e dicionários.
Enunciado: O código abaixo define uma função recursiva que recebe 2 números inteiros em parâmetros chamados "inicio" e "fim”. A função imprime número sim, número não, na faixa de "inicio" até "fim". Por exemplo, se "inicio" for 0 e "fim" for 10, a função deve imprimir 0, 2, 4, 6, 8 e 10. Identifique o caso base dessa recursão, justificando sua resposta.
if inicio <= fim:
print(inicio)
imprime_pulando(inicio + 2, fim)
👉 Repare que a chamada recursiva só acontece se inicio <= fim.
Isso significa que o programa continua "pulando de 2 em 2" enquanto a condição for verdadeira.
Quando inicio fica maior que fim, o if não executa:
- nada é impresso,
- não há nova chamada recursiva,
- e a função "volta" encerrando a cadeia.
Ou seja, o caso base implícito é inicio > fim.
Esse é o ponto em que a recursão termina naturalmente.
Enunciado: O código abaixo define uma função que deveria retornar a soma de todos os números inteiros na faixa de "inicio" até "fim". Entretanto, está faltando o caso base no código, e ele executará indefinidamente! Corrija o código adicionando o caso base correto.
Enunciado: Escreva uma função recursiva que recebe um array de strings e retorna o nº total de caracteres em todas as strings.
Enunciado: Escreva uma função recursiva que recebe um array de números inteiros e retorna um novo array contendo apenas os números pares.
Enunciado: Escreva uma função recursiva que recebe uma string e retorna o 1º índice que contém o caractere 'x'. Caso a string não contenha 'x', a função deve retornar -1.
Enunciado: Escreva um programa que receba como argumento de linha de comando uma string e imprima o caminho de todos os arquivos existentes no diretório corrente (incluindo os arquivos dos subdiretórios) cujos nomes incluam a string de entrada.
Enunciado: Escreva uma função recursiva chamada "potencia" para elevar um nº a uma potência. Ela deverá ter 2 parâmetros: base (int ou float) e expoente (int). Teste sua função com várias combinações, incluindo expoentes positivos e negativos, além dos casos especiais em que o expoente é 0 ou 1.
Enunciado: Escreva uma função recursiva chamada "imprime_numeros" que receba uma lista contendo tanto números quanto outras listas (aninhadas) e imprima todos os números existentes na lista, um por um.
Enunciado: O código abaixo define uma função recursiva que retorna a soma dos números de uma lista a partir de um índice inicial, ignorando números que fariam a soma ultrapassar 100. Corrija o código para eliminar as chamadas recursivas desnecessárias.
Enunciado: Use a notação Big O para descrever a complexidade da função "soma_ate_100" corrigida que você implementou na questão anterior, justificando sua resposta.
Enunciado: O código abaixo define uma função recursiva que calcula o N-ésimo número de uma sequência matemática conhecida como sequência de Golomb. Entretanto, ela é terrivelmente ineficiente! Reescreva a função usando memoização para otimizá-la.
Enunciado: No problema dos "caminhos únicos", queremos calcular o nº de diferentes caminhos mais curtos possíveis do canto superior esquerdo até o canto inferior direito de um grid. Reescreva a função recursiva abaixo usando memoização para melhorar sua eficiência.
Enunciado: Reescreva a função da questão anterior, desta vez usando programação dinâmica bottom-up para melhorar sua eficiência.
Enunciado: Escreva uma função que recebe um array de números positivos e retorna o maior produto de quaisquer 3 números do array. Sua função deve ter complexidade O(N log N).
Enunciado: Desenvolva uma função que implemente o algoritmo quicksort para ordenar uma lista de cores (dicionários) usando os seguintes critérios: (1) ordem crescente de R; (2) em caso de empate, ordem crescente de G; (3) em caso de empate, ordem crescente de B.
Enunciado: Desenvolva uma função que implemente o algoritmo quickselect para encontrar e retornar os K primeiros colocados em um processo seletivo. Critérios: (1) maior pontuação; (2) em caso de empate, maior idade.