Olá Gabriel.
Tudo bem?
O return em Python serve para retornar um valor de uma função para o código que chamou essa função.
Isso significa que quando você usa return, você está "saindo" da função e devolvendo um valor para quem a chamou.
O return também pode ser visto como a maneira de a função comunicar o resultado de seu processamento para o restante do programa.
Quando você não usa return, a função executa o código dentro dela, mas não retorna nenhum valor explicitamente.
Por padrão, funções que não têm return retornam None.
Em algumas funções, o return pode não ser necessário, como em funções que têm efeitos colaterais (como imprimir algo na tela ou modificar algo no estado global), mas quando você precisa de um valor de resultado que vai ser usado fora da função, aí o return se torna necessário.
No caso da função soma(n), o return dentro dela é o que permite que a função recursiva "retorne" a soma de todos os números até o valor de n.
A função funciona da seguinte maneira:
- Ela verifica se
n é igual a 1. Se for, o return 1 encerra a função e retorna o valor 1. - Se
n não for igual a 1, a função chama a si mesma (recursão) com n - 1 e adiciona o valor de n ao que foi retornado pela chamada recursiva anterior.
A ideia por trás da recursão é que a função vai continuar se chamando até atingir o caso base (n == 1). Quando ela chega nesse ponto, ela começa a "voltar", ou seja, cada chamada recursiva vai sendo resolvida e o valor de n é somado à chamada anterior.
Por exemplo, se o usuário digitar 3:
soma(3) chama soma(2), que chama soma(1).soma(1) retorna 1.- Agora,
soma(2) é igual a 2 + 1 (o valor retornado de soma(1)), que dá 3. - E finalmente,
soma(3) é igual a 3 + 3 (o valor retornado de soma(2)), que dá 6.
Esse processo é a recursão em ação, onde cada chamada recursiva espera que as chamadas anteriores sejam resolvidas para então fazer a soma.
Então, ao contrário de um loop, onde a máquina vai iterar explicitamente de 1 até n, na recursão a máquina "espera" que cada chamada anterior seja resolvida para então retornar o resultado final.
A diferença é que na recursão a execução é dividida em várias chamadas de funções, cada uma esperando o retorno da próxima.
Avise alguma duvida.
Bons estudos.