|
|
1
12
你一定要去看看 但稍后我将尝试发布一个更全面的答案。 更新 好的,下面是一个解决方案。它将莫里斯序列表示为int的lazylist中的lazylist,因为我假定您希望它在“两个方向”上都是懒惰的。 f lazylist(在fsharp.powerpack.dll中)有三个有用的属性:
第一个属性与Seq(IEnumerable)相同,但其他两个属性对于Lazylist是唯一的,对于计算问题(如本问题中提出的问题)非常有用。 无需进一步说明,代码:
更新2 如果你只想数数,那也没关系:
内存使用率保持不变(在我的盒子上低于16米)…还没有跑完,但我计算了第55个长度很快,即使是在我的慢盒子上,所以我认为这应该工作得很好。还要注意,我在长度上使用了“bignum”,因为我认为这将溢出一个“int”。 |
|
|
2
3
我认为这里有两个主要问题:
在计算第50个子序列的长度时,下面的代码比您的实现快80倍以上,但对于您来说,这可能还不够懒:
这个功能的核心是折叠
|
|
|
3
0
只需保存您查找的上一个元素。
|