- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Haskell 语言的新手,为了学习,我想我会加入一些 Project Euler。在 Project Euler 25我们的任务是执行以下操作:
第 12 项 F12 是第一个包含三位数字的项。斐波那契数列中包含 1000 位数字的第一项的索引是多少?
这是我对问题的解决方案:
fibGen :: Int -> Int
fibGen 0 = 0
fibGen 1 = 1
fibGen n = fibGen (n-1) + fibGen (n-2)
stepper n
| length (show ( fibGen n )) >= 1000 = n
| otherwise = stepper n + 1
这里的n
只是序列的起点。但是这种方法非常慢,在我决定尝试另一种方法之前已经运行了一个多小时。然后我找到了另一个解决方案如下:
fibs = 0:1:(zipWith (+) fibs (tail fibs))
t = 10^999
problem_25 = length w
where
w = takeWhile (< t) fibs
而且速度非常快。
所以我的问题是第一种方法有什么问题导致速度如此之慢。
最佳答案
So my question is what is wrong in the first approach that is making it so slow.
您的第一种方法在 stepper
的定义中有一个无限循环,但是尽管如此,由于指数分支策略,即使没有无限循环也会花费相当多的时间。
您的第一种方法会导致指数递归。事实上,除了这两个基本情况,所有其他情况都会导致两次额外的调用:
fibGen :: Int -> Int
fibGen 0 = 0
fibGen 1 = 1
fibGen n = <b>fibGen (n-1)</b> + <b>fibGen (n-2)</b>
因此,这意味着对于 fibGen 5
,我们将评估为:
fibGen 5
- fibGen 4
- fibGen 3
- fibGen 2
- fibGen 1
- fibGen 0
- fibGen 1
- fibGen 2
- fibGen 1
- fibGen 0
- fibGen 3
- fibGen 2
- fibGen 1
- fibGen 0
- fibGen 1
因此,为了计算 fibGen 5
,我们将总共进行 15 次调用。一个用于fibGen 4
,两个用于fibGen 3
,三个用于fibGen 2
,五个用于fibGen 1
,三个对于 fibGen 0
。
每次我们增加 n
时,我们几乎都会将调用量增加一倍。很明显,对于一个大的 n
,调用的数量大到现代机器仍然无法处理它。
此外,您的 stepper
函数被定义为无限循环。事实上,您的函数的一个更详细的变体是:
<b>stepper n</b>
| length (show ( fibGen n )) >= 1000 = n
| otherwise = (<b>stepper n</b>) + 1
这意味着如果您计算stepper n
,并且约束失败,您再次调用stepper n
,稍后您将添加1
到那个结果,但你因此陷入了无限循环。
您可以通过添加括号来解决此问题:
<b>stepper n</b>
| length (show ( fibGen n )) >= 1000 = n
| otherwise = stepper <b>(</b>n + 1<b>)</b>
现在程序最终会终止,但由于递归定义中的分支,这将花费很多时间。请注意,每次调用 fibGen
时,它都会再次分支,这意味着即使我们修复了无限循环,如果我们调用了 fibGen 5
,那么如果我们稍后调用 fibGen 6
,我们将再次执行所有工作以计算 fibGen 5
以计算 fibGen 6
。因此,我们在这里不使用内存。
另一方面,您的第二个斐波那契程序生成一个列表,并重复使用列表中的结果。 fib
将因此评估为:
0 : 1 : zipWith …
-> 0 : 1 : 1 : zipWith …
-> 0 : 1 : 1 : 2 : zipWith …
-> 0 : 1 : 1 : 2 : 3 : zipWith …
-> 0 : 1 : 1 : 2 : 3 : 5 : zipWith …
因此这不会受到分支的影响,因为它重用已经在列表中的结果。
关于haskell - 使用 haskell 投影 euler 25 的缓慢解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58012505/
每当我设置 Border.Effect属性的投影效果 控件中包含的每个控件都有一个投影。 有没有办法将阴影设置到边框而不是边框中包含的每个控件? 这是我的代码的一个简短示例:
我正在尝试创建一个带有阴影的对象。我相信您需要 CSS3 来执行此操作,到目前为止我已经有了类似的东西。 div { width:300px; height:100px; background
我希望能够为我的 drawables 文件夹中的矢量添加阴影。目前,当我将具有阴影的 svg 导入 Android Studio 时,转换为 xml 会删除阴影。 我将如何在 Android Stud
使用 NHibernate 2.1,我试图将一个实体及其子集合投影到 DTO 中。我的实体看起来像这样.. public class Application { public int Id {ge
我有问题还是好,我不知道如何将x,y,z值的3d点转换为2d点, 我必须绘制投影,其中的点确实有x,y,z值,但是我不知道如何将它们转换为2d,所以我可以将它们移动到我的轴上。 我一直在寻找Wiki和
我有域类位置 public abstract class BaseEntity where T: struct { public virtual T Id { get; set
我有一个使用 Android Material 图标作为背景的 ImageView 。我尝试添加标高以创建投影效果,但仅显示图标。是否可以将标高添加到矢量资源可绘制对象中? 矢量代码:
我正在尝试连接并以逗号分隔(或空格)列表并将其投影。我在下面有一些示例代码。 public class Friend { public string Name { get; set; } }
是否有任何库可以轻松地允许 Java bean 投影? 我有一个按照 Javabean 约定用 getter 和 setter 编写的 bean,并且在运行时在不同的地方我想要获取一个完全填充的 be
我可以成功地做到: point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:
我对 OpenLayers 3 有点问题。我有以下脚本: var map = new ol.Map({ view : new ol.View({ center : [5.611
我正在尝试向 ImageView 添加阴影。 Stackoverflow 的另一个答案似乎是使用 Canvas 和位图等,比需要的复杂得多。 在 iOS 上我会做这样的事情: myImageView.
我有一个 JPanel 元素,我想给它添加一个阴影,我怎样才能给元素添加一个漂亮的褪色阴影?我需要使用外部库还是可以使用内置的东西? 例子: 最佳答案 所以我查看了 swingx它扩展了 JPanel
如何使用 MongoDB 查询预测作者的名字 { name: "Wings Of Fire", author: { first: "Abdul", last: "Kalam" } }
我有一个集合“帐户”,其中包含类似于此结构的文档: { "email" : "john.doe@acme.com", "groups" : [ {
我试图弄清楚如何使用枚举列表(@ElementCollection)对实体进行 DTO 投影。不幸的是,缺少 QueryDsl 文档,在这里我只能找到版本 3 的结果 不是 适用于版本 4。 @Ent
我想要悬停 div 时出现的箭头 here也投下影子。箭头是从 CSS 绘制的: .arrow { position:absolute; margin-top:-50px; left:80px; bo
如何使用 QueryOver 和 AliasToBean 将枚举值转换为字符串值?我有以下但在尝试转换 Enum 时出错: SomeDTO someDTO = null;
我有这个外部 GeoJSON 文件: {"type": "FeatureCollection", "features": [ {"type":"Feature", "id":382, "propert
我对 Hibernate 的预测和标准有点困惑。何时使用预测以及何时使用标准? 最佳答案 它们并不相互排斥,您可以同时使用两者。预测通常在某些标准的背景下使用。 简单地说,Hibernate Proj
我是一名优秀的程序员,十分优秀!