当前位置: 首页 > 知识库问答 >
问题:

Haskell中的无限懒惰阶乘

刘丰羽
2023-03-14

可以以与斐波那契数列类似的方式生成如下,

fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

如何定义阶乘级数。

使现代化

令人尴尬的是,在添加这个问题之前,我已经试过了,

Prelude> let factorial = 2 : 6 : zipWith(*) factorial (tail factorial)
Prelude> take 5 factorial
[2,6,12,72,864]

事实上,尾部的数字并不是连续的值。

共有3个答案

仰翰采
2023-03-14

给出了阶乘的通常定义:

factorial :: Integer -> Integer 
factorial 0 = 1
factorial i = foldr (*) 1 [2..i]

我们只需在所有正数的无限列表上运行阶乘函数,就可以生成所有阶乘的无限列表:

inFact :: [Integer]
inFact = map factorial [0..]

现场演示

邴墨竹
2023-03-14

懒惰阶乘列表的惯用定义根本不是递归的:相反,它使用了前奏函数scanl。

factorials = scanl (*) 1 [1..]
韩飞翮
2023-03-14

让我们退一步,记住懒惰版本实际上来自哪里:

fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

我们也可以类似地定义阶乘:

factorial 0 = 1
factorial n = factorial (n - 1) * n

如您所见,我们的压缩操作实际上是(*),第二个列表将不是阶乘的子列表,而是[x…]

factorials = 1 : zipWith (*) factorials [x..]

x应该是什么值?第二个元素应该是1=1*1,所以它自然是1

factorials = 1 : zipWith (*) factorials [1..]

注意,我们只需要给出第一个元素,因为我们不使用尾部或类似的东西。正如你所见,你的尝试几乎是正确的。您刚才在左侧使用了错误的值:

Prelude> let factorial = 2 : 6 : zipWith (*) [4..] (tail factorial)
Prelude> take 10 $ factorial
[2,6,24,120,720,5040,40320,362880,3628800,39916800]

备注:阶乘序列为0!,1.2.因此,如果您想要符合OEIS,请从[1,1,…]开始

 类似资料:
  • 我试图在primefaces数据表设置中实现延迟加载。目前,在没有延迟加载实现的情况下,这是可行的,但是在实现延迟加载后,我在datatable中没有得到任何数据。但是,我可以在我的LoadData方法中打印我的列表,以验证数据是否正在加载到我的列表中,但一旦返回我的LazyModel并尝试加载datatable,似乎就会出现问题。这可能只是我忽略的一些简单的事情。非常感谢您的帮助! 这是我的屏幕

  • 我已经写了两个版本的nqueens问题,我认为它们应该有相似的效率,但事实并非如此。我认为这是由于哈斯克尔的懒惰评估行为。有人能解释一下下面的例子是如何工作的吗, 您可以通过调用nqueens1 8 8或nqueens2 8 8对其进行评估,以对大小为8的板进行评估。 虽然nqueens2工作效率很高,但nqueens1存在性能问题。我相信这是因为递归调用(nqueens n(k-1))被多次评估

  • 在一次编程练习中,首先要求对阶乘函数进行编程,然后计算总和:在乘法中(所以我们不能直接使用阶乘)。我不是在寻找这个特定(琐碎)问题的解决方案,我试图探索Haskell的能力,这个问题是我想玩的玩具。 我认为Python的生成器可以很好地解决这个问题。例如: 然后我试图弄清楚Haskell中是否有与这个生成器相似的行为,我认为懒惰对所有员工都没有任何额外的概念。 例如,我们可以用 然后用以下方法解决

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 本文向大家介绍groovy 懒惰的表达,包括了groovy 懒惰的表达的使用技巧和注意事项,需要的朋友参考一下 示例 我们可以在字符串中进行惰性插值。这与普通插值不同,因为每当将GString转换为String时,它可能具有不同的值(取决于闭包)。            

  • 描述 (Description) Lazy DynaBeans是DynaBean的一个实现,它提供了Lazy List和Lazy Map的特性,它连接了DynaClass的属性。 有两种类型的Lazy DynaBeans: LazyDynaBean :它指定惰性DynaBean,它提供名称和数据类型的动态修改属性。 LazyDynaMap :它通过使用惰性映射或列表系统,使DynaBean的轻量级