1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| def suite_syracuse(n):
"""
Retourne la suite de Syracuse pour l'entier n.
>>> suite_syracuse(15)
[15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
"""
seq = [n] # La suite de Syracuse sera complétée...
while seq[-1] != 1: # ...jusqu'à tomber sur 1
if seq[-1] % 3 == 0:
seq.append(seq[-1] // 3) # Division euclidienne par 3
elif seq[-1] % 2 == 0: # u_n est pair
seq.append(seq[-1] // 2)
else: # u_n est impair
seq.append(seq[-1] * 5 + 1)
return seq
def temps_syracuse(n, altitude=False):
"""
Calcule le temps de vol (éventuellement en altitude) de la suite
de Syracuse pour l'entier n.
>>> temps_syracuse(15)
17
>>> temps_syracuse(15, altitude=True)
10
"""
seq = suite_syracuse(n)
if not altitude: # Temps de vol total
return len(seq) - 1
else: # Temps de vol en altitude
# Construction de la séquence en altitude
alt = []
for i in seq:
if i >= n:
alt.append(i)
else:
break
return len(alt) - 1
if __name__ == '__main__':
n = 15
print("Suite de Syracuse pour n =", n)
print(suite_syracuse(n))
print("Temps de vol total: ", temps_syracuse(n))
print("Temps de vol en altitude:", temps_syracuse(n, altitude=True)) |
Partager