haskell - ghci 超级慢吗?
问题描述
以下用于查找低于给定限制的所有完美数字的 Haskell 程序在我的计算机上的 ghci 中执行大约 5-10 秒,n=10000:
perf :: Int -> Bool
perf n = sum [d | d<-[1..div n 2], mod n d==0] == n
perfects :: Int -> [Int]
perfects l = [n | n<-[1..l], perf n ]
为什么执行如此缓慢?
解决方案
你用来检查一个项目是否是一个完美数字的算法需要线性时间,这意味着你perfects
需要二次时间。
您可以通过仅枚举并包括平方根来改进检查项目是否为完美数字的算法。如果我们找到 的除数i
,n
我们也知道它n/i
也是一个除数。因此,我们可以将其实现为:
perf :: Int -> Bool
perf n = sum [ withco l | l <- ls, mod n l == 0 ] == n - 1
where ls = takeWhile ((n >=) . (^2)) [ 2 .. ]
withco i
| i*i == n = i
| otherwise = i + div n i
推荐阅读
- r - 使用 st_as_sf() 绘制等高线在本地 Shiny 中有效,但在 shinyapps.io 上无效
- python - Flask 显示 TypeError: send_from_directory() 缺少 1 个必需的位置参数:'path'
- laravel - Laravel Websockets - 以前工作的 websockets 现在已经停止工作
- python - 如何在 Tkinter 中正确使用 `.grid()`
- java - 对于使用 Maven 的 Spring Boot 应用程序,所有页面都在 Postman 中给出 404 错误
- python - 使用 psycopg2.connect 获取 Postgres 数据库连接的问题,无法转换主机名
- php - ACF 日期字段查询的 WordPress get_posts() 不返回任何内容
- ionic-framework - 如何将数据从 IONIC 5 中的输入表单传递到另一个页面
- java - FileObserver 是原子的(在 android 中)吗?
- python - 隐藏窗口时如何使用Qt将文本添加到系统剪贴板?