Há tempos atráz foi publicado no grupo de usuários python do Ceará um
desafio que consiste no seguinte:
------------------
PROBLEMINHA
------------------
Considere que, para um determinado número inteiro n existe uma
sequencia de números a partir de n que leva ao número 1. Tal
sequencia será definida da seguinte forma:
* se n for ímpar, multiplique n por 3 e some 1 para obter o próximo número da sequencia
* caso contrário, ou seja, se n for par, divida o por 2 para obter o próximo número
Para determinar se um número é ímpar ou par utilize o operador "%".
Este operador retorna o resto da divisão, logo, se "n % 2 == 1"
significa que o número é ímpar, pois o resto da divisão por 2 foi
igual a um.
Vejamos um exemplo, para n igual a 22 teremos a seguinte sequencia:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
A princípio eu não entendi a solução final postada pelo
Nicholas Amorin (vou postar no código abaixo 2 soluções).
Mas finalmente, me debruçando com um pouco mais de atenção sobre a solução do Nicholas percebi a elegância do algoritmo postado por ele
- Ele cria uma lista - observe o input dentro de colchetes, isso permite que ele use mais adiante o método apend da classe list.
- Ele cria um função lambda que trabalha com a lógica de semáforo do python, quando ele usa o and aqui: ((x % 2) and x * 3 + 1) or x / 2
ele só executa o x*3+1 se o número for impar, pois o resultado de x%2 para um número par é zero, que para o python é falso, como falso e verdadeiro não é válido para uma cláusula "and" ele passa direto para o x/1 - No final ele usa de forma elegante o slicing (fatiamento) de listas com a opção -1