Подснежная последовательность, оптимизация кода
Пусть s(n) - ближайший квадрат к натуральному числу n. Подснежная последовательность строится следующим образом: первые два её члена это 1 и 3, а каждый следующий член a_k=s(a_{k-1})+s(a_{k-2}). Написать программу, которая печатает первые 20 членов подснежной последовательности.
# Пусть s(n) - ближайший квадрат к натуральному числу n.
# Подснежная последовательность строится следующим образом:
# первые два её члена это 1 и 3, а каждый следующий член
# a_k=s(a_{k-1})+s(a_{k-2}). Написать программу,
# которая печатает первые 20 членов подснежной последовательности.
def nearest_square(n):
root = int(n**0.5)
lower_diff = abs(n - root**2)
upper_diff = abs(n - (root + 1)**2)
return root**2 if lower_diff <= upper_diff else (root + 1)**2
def snowdrop_sequence(n):
sequence = [1, 3]
for i in range(2, n):
next_term = nearest_square(sequence[-1]) + nearest_square(sequence[-2])
sequence.append(next_term)
return sequence
first_20_terms = snowdrop_sequence(20)
print(first_20_terms)
Вывод программы: 1, 3, 5, 8, 13, 25, 41, 61, 100, 164, 269, 425, 697, 1117, 1765, 2853, 4573, 7433, 12020, 19496
Теперь представим, что нам нужно не 20, а достаточно много членов подснежной последовательности. Как можно ускорить код?
Источник: Stack Overflow на русском