RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1506766
Accepted
Ян Альбертович Дененберг
Ян Альбертович Дененберг
Asked:2023-03-21 07:38:01 +0000 UTC2023-03-21 07:38:01 +0000 UTC 2023-03-21 07:38:01 +0000 UTC

白雪皑皑的序列,代码优化

  • 772

设 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 序列中的相当多的成员。你如何加速代码?

python
  • 2 2 个回答
  • 30 Views

2 个回答

  • Voted
  1. Ян Альбертович Дененберг
    2023-03-21T08:05:37Z2023-03-21T08:05:37Z

    @tym32167 喜欢这样吗?

    from functools import lru_cache
    
    @lru_cache(maxsize=None)  # Кешируем результаты функции nearest_square
    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
    
    # Теперь при больших значениях n, код будет работать быстрее
    first_100_terms = snowdrop_sequence(100)
    print(first_100_terms)
    

    程序输出:

    1, 3, 5, 8, 13, 25, 41, 61, 100, 164, 269, 425, 697, 1117, 1765, 2853, 4573, 7433, 12020, 19496, 31700, 51284, 82760, 134020, 216900, 351112, 568805, 920165, 1488197, 2408081, 3897104, 6305380, 10201797, 16506757, 26709605, 43216193, 69925700, 113140520, 183068813, 296206669, 479279421, 775478185, 1254715073, 2030173493, 3284851333, 5315027845, 8599887812, 13914958912, 22514999140, 36430035944, 58945214189, 95375253485, 154320393037, 249695474137, 404015215921, 653710419909, 1057726385460, 1711436916340, 2769162809725, 4480599198361, 7249763174449, 11730361809493, 18980125582888, 30710493812605, 49690623418186, 80401122815989, 130091745597853, 210492866062618, 340584607064113, 551077447034740, 891662044995877, 1442739517477042, 2334401572620442, 3777141062960946, 6111542628168525, 9888683713841236, 16000226356582057, 25888910036127322, 41889136396880722, 67778046436976170, 109667182878757033, 177445229232365748, 287112412194693453, 464557641302556514, 751670053750020250, 1216227696366846501, 1967897750744648520, 3184125448249755144, 5152023198937958949, 8336148646858989345, 13488171844543537257, 21824320486505393170, 35312492328873094585, 57136812821284645465, 92449305150700940314, 149586117968721087925, 242035423114604532541, 391621541062391098237, 633656964170622875752, 1025278505252824589892
    
    • 2
  2. Best Answer
    CrazyElf
    2023-03-21T13:07:02Z2023-03-21T13:07:02Z

    事实上,对于计算你只需要函数的最后两个值,你可以记住并移动它们。这里只是代码的修改部分:

    def snowdrop_sequence(n):
        sequence = [1, 3]
        nearest_2, nearest_1 = list(map(nearest_square, sequence))
        for i in range(2, n):
            next_term = nearest_1 + nearest_2
            sequence.append(next_term)
            nearest_1, nearest_2 = nearest_square(next_term), nearest_1
        return sequence
    
    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5