3*+1 em python

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
  1. Ele cria uma lista - observe o input dentro de colchetes, isso permite que ele use mais adiante o método apend da classe list.
  2. 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
  3. No final ele usa de forma elegante o slicing (fatiamento) de listas com a opção -1

Nenhum comentário:

Postar um comentário

Insira seu comentário - O mesmo será submetido à aprovação!

linux-cookbook

Grupos do Google
Participe do grupo linux-cookbook
E-mail:
Visitar este grupo