Quanti passi sono necessari per arrivare a 1?
1
n = int(input("n = "))
lunghezza = 1
while(n != 1):
lunghezza += 1 # conta un nuovo passo
if(n%2 == 0): # se n è pari si divide per 2
n = n // 2
else: # se n è dispari...
n = 3*n + 1
print(lunghezza)
2
Facoltativo: visualizza la sequenza da n a 1, compresi
n = int(input("n = "))
print(n, end=' ') # Visualizza il numero di partenza
lunghezza = 1
while(n != 1):
lunghezza += 1
if(n%2 == 0):
n = n // 2
else:
n = 3*n + 1
print(n, end=' ') # visualizza il risultato dell'algoritmo
print()
print(lunghezza)
Versione OII
f = open("input.txt", "r")
n = int(f.read())
f.close()
lunghezza = 1;
while(n != 1):
lunghezza += 1
if(n%2 == 0):
n = n // 2
else:
n = 3*n + 1
f = open("output.txt", "w")
f.write(str(lunghezza))
f.close()
Problema: da 10 a 20
NUM è il numero da 10 a 20 con lunghezza minima LUN
def lunghezza(n):
conto = 1
while(n != 1):
conto += 1
if(n%2 == 0):
n = n // 2
else:
n = 3*n + 1
return conto
PRIMO = 10
ULTIMO = 20
NUM = 0
LUN = 1000 # esagerato...
for num in range(PRIMO, ULTIMO+1):
lun = lunghezza(num)
if(lun < LUN):
NUM = num
LUN = lun
print(num,lun) # facoltativo
print(NUM, ':', LUN)
matplotlib
La sequenza per n=167

import matplotlib.pyplot as plt
n = 167
N = []
N.append(n)
while(n != 1):
if(n%2 == 0):
n = n // 2
else:
n = 3*n + 1
N.append(n)
plt.grid(which="major")
plt.plot(N)
plt.title("Congettura di Collatz, n=" + str(n))
plt.show()
Lunghezze per n da 10 a 20

Problema: da 48 a 52

import matplotlib.pyplot as plt
import math
def lunghezza(n):
conto = 1
while(n != 1):
if(n%2 == 0):
n = n // 2
else:
n = 3*n + 1
conto += 1
return conto
PRIMO = 10 # 48
ULTIMO = 20 # 52
x = range(PRIMO,ULTIMO+1)
y = []
NUM = 0
LUN = math.inf
for num in x:
lun = lunghezza(num)
print(num, lun)
y.append(lun)
if(lun < LUN):
NUM = num
LUN = lun
print("-->", NUM, LUN)
plt.bar(x, y)
plt.title("Congettura di Collatz, n=10..20")
plt.show()
Problema: da 1 a 100 (1000)


import matplotlib.pyplot as plt
def lunghezza(n):
conto = 1
while(n != 1):
if(n%2 == 0):
n = n // 2
else:
n = 3*n + 1
conto += 1
return conto
PRIMO = 1
ULTIMO = 100 # 1000
x = range(PRIMO, ULTIMO+1)
y = []
for n in x:
lun = lunghezza(n)
print(n, lun) # facoltativo
y.append(lun)
plt.bar(x, y)
plt.title("Congettura di Collatz, n=" + str(PRIMO) + ".." + str(ULTIMO))
plt.show()
Ripeti tutti gli esercizi ma analizza l’altezza massima delle sequenze