/ / Sequência Collatz - python, sequência, collatz

Sequência Collatz - python, sequência, collatz

Como posso tomar um inteiro como entrada, cuja saída será o Sequência Collatz seguindo esse número. Essa sequência é calculada pelas seguintes regras:

  • se n é par, o próximo número é n/2
  • se n é ímpar, o próximo número é 3n + 1.

por exemplo. ao começar com 11

11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

Este é o meu código agora:

n = int(raw_input("insert a random number"))

while n > 1:
if n%2 == 0:
n_add = [n/2]
collatz = [] + n_add
else:
n_add2 = [3*n + 1]
collatz = [] + n_add2
print collatz

se eu executar isso e inserir um número, nada acontece.

Respostas:

1 para resposta № 1

Você nunca está mudando o número n, então será o mesmo a cada vez. Você também só está imprimindo se o número for ímpar. Além disso, colchetes [] indicar um array - Eu não tenho certeza qual é o seu objetivo com isso. Eu provavelmente iria reescrever assim:

n = int(raw_input("insert a random number"))

while n > 1:
if n%2 == 0:
n = n/2
else:
n = 3*n + 1
print n

Você pode querer levar algum tempo para comparar e contrastar o que estou fazendo com suas instruções - é quase literalmente uma tradução palavra por palavra (exceto pelo print

É um pouco incerto do seu código se você quer apenas imprimi-los quando eles saem, ou se você quiser coletá-los todos e imprimi-los no final.


1 para resposta № 2

Você deveria estar modificando n cada vez, isso fará o que você quer:

n = int(raw_input("insert a random number"))
while n > 1:
n = n / 2 if not n & 1 else 3 * n + 1 # if  last bit is not set to 1(number is odd)
print n

## -- End pasted text --
insert a random number11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Usando seu próprio código para apenas imprimir cada n:

n = int(raw_input("insert a random number"))

while n > 1:
if n % 2 == 0:
n = n / 2
else:
n = 3 * n + 1
print n

Ou mantenha tudo em uma lista e imprima no final:

all_seq = []
while n > 1:
if n % 2 == 0:
n = n / 2
else:
n = 3 * n + 1
all_seq.append(n)
print(all_seq)

0 para resposta № 3
def collatz(number):
while number != 1:
if number % 2 == 0:
number = number // 2
print(number)

elif number % 2 == 1:
number = number * 3 + 1
print(number)

try:
num = int(input("Please pick any whole number to see the Collatz Sequence in action.n"))
collatz(num)
except ValueError:
print("Please use whole numbers only.")

0 para a resposta № 4

Eu também tenho trabalhado nisso por um tempo agora, e aqui está o que eu criei:

def collatz (number):
while number != 1:
if number == 0:
break
elif number == 2:
break
elif number % 2 == 0:
number = number // 2
print (number)
elif number % 2 == 1:
number = 3 * number + 1
print (number)
if number == 0:
print ("This isn"t a positive integer. It doesn"t count")
elif number == 2:
print ("1")
print ("Done!")
elif number == 1:
print ("1")
print ("Done!")

try:
number = int(input("Please enter your number here and watch me do my magic: "))
except (ValueError, TypeError):
print ("Please enter positive integers only")

try:
collatz(number)
except (NameError):
print ("Can"t perform operation without a valid input.")