numbers = [int(raw_input("enter number: "))]
p = lambda x: ((x % 2) and x * 3 + 1) or x / 2
while numbers[-1] != 1: numbers.append(p(numbers[-1]))
print numbers
Refactorings
No refactoring yet !
Anony
March 8, 2010, March 08, 2010 22:56, permalink
Not in any way better than yours, but for some reason I felt compelled to refactor it in to a single expression...
(lambda n:(lambda i=[n]:reduce(lambda a,x:(x!=1 and i.append(x%2 and x*3+1 or x/2)) or a+[x],i,[]))())(22)
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