我正在查看一些示例Fibonacci序列clojure代码:
(def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))
Run Code Online (Sandbox Code Playgroud)
我一般都明白发生了什么,但不明白lazy-cat.我知道这lazy-cat是一个宏,正在翻译成这样的东西:
(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs)))))
Run Code Online (Sandbox Code Playgroud)
究竟是什么lazy-seq实现的?即使没有,它仍会被懒惰地评估lazy-seq?这是否严格用于缓存目的?
编辑:谢谢你的答案.令我感到困惑的是,它与concatREPL中的一个普通模式一起工作,因为我之前已经在范围内绑定了fibs.
给定一个有限的元素列表,我如何创建一个(懒惰评估,谢谢LINQ!)无限列表,只是不断迭代我的初始列表?
如果是初始列表{1, 2, 3},我想要返回新列表{1, 2, 3, 1, 2, 3, 1, ...}
我正在努力解决Project Euler问题#12:
通过添加自然数来生成三角数的序列.所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个术语是:
Run Code Online (Sandbox Code Playgroud)1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...让我们列出前七个三角形数字的因子:
Run Code Online (Sandbox Code Playgroud)1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28我们可以看到28是第一个有超过五个除数的三角形数.拥有超过500个除数的第一个三角形数的值是多少?
这是我使用Ruby提出的解决方案:
triangle_number = 1
(2..9_999_999_999_999_999).each do |i|
triangle_number += i
num_divisors = 2 # 1 and the number divide the number always so we don't iterate over the entire sequence
(2..( i/2 + 1 )).each do …Run Code Online (Sandbox Code Playgroud) 我有一段代码,代码如下:
val e2 = for (e <- elements if condition(expensiveFunction(e))) yield {
expensiveFunction(e)
}
Run Code Online (Sandbox Code Playgroud)
条件对于少数元素是正确的,然后对所有剩余的元素变为假.
不幸的是,这不起作用(即使我忽略性能)因为我elements是一个无限的迭代器.
有没有办法在for-comprehension中使用"break",这样当某个条件成立时它会停止产生元素?否则,计算我的scala-idiomatic方法是e2什么?
给出一个起始数字,想象一下它连续一半的无限序列.
1, 0.5, 0.25, 0.125, ...
Run Code Online (Sandbox Code Playgroud)
(忽略其中固有的任何数值不稳定性double.)
这可以在单个表达式中完成而无需编写任何自定义扩展方法或生成器方法吗?
我不是Google App Engine用户.但是,我知道您需要为CPU时间和其他资源付费.如果碰巧创建无限循环会有什么后果?谷歌是否会终止它,或者你必须以某种方式自己手动完成它吗?
我是一个业余爱好者开发者担心一个小错误,最终可能导致数百美元的损失.
序幕
在Raku有一个概念叫infinite listAKAlazy list中定义和使用的一样:
my @inf = (1,2,3 ... Inf);
for @inf { say $_;
exit if $_ == 7 }
# => OUTPUT
1
2
3
4
5
6
7
Run Code Online (Sandbox Code Playgroud)
我想在 Common Lisp 中实现这种事情,特别是一个无限的连续整数列表,例如:
(defun inf (n)
("the implementation"))
Run Code Online (Sandbox Code Playgroud)
以至于
(inf 5)
=> (5 6 7 8 9 10 .... infinity)
;; hypothetical output just for the demo purposes. It won't be used in reality
Run Code Online (Sandbox Code Playgroud)
然后我将使用它进行这样的惰性评估:
(defun try () ;; catch and dolist …Run Code Online (Sandbox Code Playgroud) itertools.count 在Racket中是否有Python的模拟?我想创建一个均匀间隔数字的无限流.in-naturals类似于我想要的,但不提供步骤.我想不要重新发明轮子,但如果没有相应的功能,怎么写一个?(我认为应该使用发电机)
我正在尝试使用a ListBox向用户显示可能无限的选项列表.目前,我只是在任意点切断列表,但我想让用户尽可能地向下滚动.此外,我希望尽可能避免生成不可见的项目,因为必须进行一些计算才能生成每个项目.
我试着写listBox.ItemsSource = enumerable它期望它只询问可枚举的可见项,而是尝试读取所有导致无限循环的项目,如果有无限多的项目.
我最好的想法是添加一个监听器,每当ListBox向下滚动时都会收到通知,并添加新项目,以便k在最后一个项目可见之后总是有更多项目(其中k可能是一次可见的项目数量,因此Page Down工作).
是否有一些更清洁的方法来处理这个?
我知道在Haskell中有无限的序列是可能的 - 但是,我不完全确定如何生成一个
给定一种方法
generate::Integer->Integer
Run Code Online (Sandbox Code Playgroud)
取一个整数并生成序列中的下一个整数,我将如何构建一个无限序列呢?
我有两个东西用于所需的无限列表:它的第一个元素
x :: A
Run Code Online (Sandbox Code Playgroud)
和生成下一个元素的函数
f :: [A] -> A
Run Code Online (Sandbox Code Playgroud)
什么是最好的(最惯用的?最快?)创建无限列表的方式?我的意思是
xs = x : f [x] : f [x, f [x]] : f [x, f [x], f [x, f [x]]] : ...
Run Code Online (Sandbox Code Playgroud)