设 s(n) 是最接近自然数 n 的平方。snow 序列构造如下:它的前两个成员是 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 个,而是 snowy 序列中的相当多的成员。你如何加速代码?
@tym32167 喜欢这样吗?
程序输出:
事实上,对于计算你只需要函数的最后两个值,你可以记住并移动它们。这里只是代码的修改部分: