在 Haskell 中创建一个列表来计算帕斯卡三角形

2024-01-06

我正在尝试创建一个接受整数的函数m并返回帕斯卡三角形的行数mth row.

我已经构建了一个choose函数,它接受两个整数 n 和 k,并返回值 n 选择 k。例如,choose 3 2返回 3。

到目前为止,我已经

pascal 0 = [1]
pascal m = [x | x <- pascal (m-1)] ++ [choose m k | k <- [0,1..m]

这返回一个大列表,但实际上,我想要一个列表列表,其中每个列表对应于帕斯卡三角形中的一行。例如pascal 3应该返回[[1],[1,1],[1,2,1],[1,3,3,1]]。目前正在回归[1,1,1,1,2,1,1,3,3,1].


有解决方案,然后就有解决方案。让我们首先从解决方案开始,然后逐步解决解决方案.

首先要观察的是,如果我们想要您声明的结果,我们必须更改类型,并进行更多包装:

-- was pascal :: Integer -> [Integer]
pascal :: Integer -> [[Integer]]
pascal 0 = [[1]]
pascal m = [x | x <- pascal (m-1)] ++ [[choose m k | k <- [0,1..m]]]

现在,一些语法提示:[x | x <- foo]最好写成foo, and [0,1..m]通常与刚刚相同[0..m]:

pascal m = pascal (m-1) ++ [[choose m k | k <- [0..m]]]

您会发现,这是在每次递归调用时将单例列表附加到另一个列表的末尾。这是低效的;最好从前面建立列表。因此,我们将使用常见的重构:我们将创建一个带有累加器的助手。

pascal = go [] where
    go 0 acc = [1] : acc
    go m acc = go (m-1) ([choose m k | k <- [0..m]] : acc)

下一个观察结果是,你可以比重新计算更有效地做事choose m k每次:您可以仅使用前一行和一些加法来计算帕斯卡三角形的下一行。这意味着我们可以构建帕斯卡三角形所有行的惰性(无限)列表。

nextRow vs = [1] ++ zipWith (+) vs (tail vs) ++ [1]
allPascals = iterate nextRow [1]

最后,由于帕斯卡三角形的所有行都在中点对称,因此您可能会尝试构建一个仅包含每行前半部分的无限列表。这将有利于消除剩余的“附加到列表末尾”操作。我把这个作为练习;请记住,行在偶数和奇数元素之间交替,这使得这部分有点棘手(也更丑陋)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Haskell 中创建一个列表来计算帕斯卡三角形 的相关文章

  • 将列表拆分为多个具有固定元素数量的列表

    如何将元素列表拆分为最多包含 N 个项目的列表 例如 给定一个包含 7 个元素的列表 创建 4 个组 最后一组可能包含较少的元素 split List 1 2 3 4 5 6 seven 4 gt List List 1 2 3 4 Lis
  • LISP 非常简单的列表问题

    我正在学习 lisp 而且我对此还很陌生 所以我想知道 如果我这样做 defparameter list 1 list 1 2 defparameter list 2 list 2 3 defparameter list 3 append
  • 如何对 glob.glob 进行数字排序?

    我在一个文件夹中有一堆按数字排序的文件 当我尝试对 glob glob 进行排序时 我从来没有以正确的顺序获得文件 文件示例和预期输出排序 folder C Users user Desktop folder 1 sample mp3 C
  • 是否有一个基于对象身份的、线程安全的记忆库?

    我知道记忆化似乎是堆栈溢出的 haskell 标签上的一个长期话题 但我think以前没有人问过这个问题 我知道 Haskell 有几个不同的 现成 记忆库 memo combinators 和 memotrie 包 利用涉及惰性无限数据结
  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • 测试 python 列表的所有元素是否为 False

    如何返回False如果所有元素都在列表中False 给定的列表是 data False False False Using any https docs python org 2 library functions html any gt
  • Haskell 中的相互递归求值器

    Update 我已经添加一个答案 https stackoverflow com questions 3524485 mutually recursive evaluator in haskell 4504200 4504200这描述了我的
  • 将用户定义的函数应用于数据框列表

    我有一系列结构与此类似的数据框 df lt data frame x c notes year 1995 2005 y c NA value 11 21 df2 lt data frame x c notes year 1995 2005
  • 如何向列表添加值>

    我需要将派生类的元素添加到抽象类的共享指针列表中 我一直在尝试这个 我知道我正在尝试在下面的示例中创建抽象类的实例 但我不知道如何使其工作 简化的类如下所示 using namespace std class Abstract public
  • Python 递归和列表

    我正在学习 python 中的递归 我有以下代码 def search l key locates key in list l if present returns location as an index else returns Fal
  • 对元组列表进行排序的函数 - Haskell

    抱歉 这个简单的问题只是我对 haskell 非常陌生 我正在尝试编写一个函数 order 它将对另一个函数 Frequency 生成的元组列表进行排序 频率计算列表中不同元素的数量 a给出一个这样的结果 比如 gt 频率 aabbbccc
  • 如何在不进行尾调用优化的情况下用函数式编程替代方案替换 while 循环?

    我正在 JavaScript 中尝试一种更实用的风格 因此 我用诸如map和reduce之类的实用函数替换了for循环 然而 我还没有找到 while 循环的功能替代品 因为尾部调用优化通常不适用于 JavaScript 据我了解 ES6
  • 查找字典中列表的最大值

    我有一个字典 每个键后面都有一个存储的列表 看起来像这样 dict with values u New York u New York u NY datetime datetime 2014 8 13 0 0 10 u New York u
  • 获取嵌套数组 JS 中对象的所有父对象

    我在使用 vuejs 的项目上遇到问题 我有一个像这样的嵌套对象数组 Data data id 1 parent id null title First folder children id 3 parent id 1 title Firs
  • 将嵌套列表转换为嵌套列表

    我知道可以将项目列表从一种类型转换为另一种类型 但是如何将嵌套列表转换为嵌套 List 已经尝试过的解决方案 List
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • 地图不是接受一个函数而列表返回一个列表吗?

    map2 List a gt b gt c gt a gt b gt c map2 List f map2 List f a as bs map f a bs map2 List f as bs 这是我的讲座中的一个示例 它尝试将二元函数应

随机推荐

  • 是否可以在 python 中 pickle itertools.product ?

    我想保存以下状态itertools product 我的程序退出后 可以用酸洗来做到这一点吗 我计划做的是生成排列 如果该过程被中断 键盘中断 我可以在下次运行程序时恢复该过程 def trywith itr try for word in
  • 如何防止我的计时器在执行回调之前进行 GC 收集?

    我需要创建一堆计时器作为局部变量来执行以下操作 void Foo Timer t new Timer myTimerCallback null 1000 Timeout Infinite 不幸的是 其中一些在 1 秒后调用 myTimerC
  • 冒号 (:) 运算符的作用是什么?

    显然 冒号在 Java 中有多种使用方式 有人介意解释一下它的作用吗 例如这里 String cardString for PlayingCard c this list lt cardString c n 你会怎么写这个for each以
  • 如何在 docker ubuntu 基础上启动 cron?

    我已经通过安装了 cronapt get install cron 尝试启动 cron 失败 如预期 因为upstart不运行 正确启动 cron 的命令行是什么 即它将读取用户的 crontab 将读取 etc crontab 等 请注意
  • 自动将数组映射到列表

    class A public List
  • 根据目录切换 npm 注册表

    我最近开始为节点进行开发 我工作的公司有一个内部 npm 注册表 我想知道如何根据我的开发位置使用不同的注册表设置 为了说明这一点 我有一个如下所示的目录结构 Code My Projects Proj 1 Proj 2 My Compan
  • Jpa prepersist 回调未在父级上调用

    My code Entity Inheritance strategy InheritanceType TABLE PER CLASS public class SiteMessage implements Identifiable Pre
  • C++11 相当于 boost shared_mutex

    是否有 C 11 的等效项boost shared mutex 或者在 C 11 中处理多个读取器 单个写入器情况的另一种解决方案 我尝试过但没能得到shared mutex进入C 11 它已被提议作为未来的标准 该提案是here http
  • “高 ASCII”字符的正确技术术语是什么?

    引用 高 ASCII 或 扩展 ASCII 字符的技术上正确的方法是什么 我指的不仅仅是128 255的范围 而是0 127范围之外的任何字符 它们通常被称为变音符号 重音字母 有时被随意称为 国家 或非英语字符 但这些名称要么不精确 要么
  • 具有动态值的 Angular index.html |网络工作者

    直到最近 我们还使用express js 来为Angular 提供index html 因为我们需要在应用程序启动之前从数据库填充动态变量 然而 新的Angular 7通过web worker缓存源index html 因此 当我加载网页时
  • 角度5根据另一个字段的值有条件地验证字段

    如何根据另一个字段的值有条件地验证一个字段 这是我尝试过的 但似乎不起作用 this PDform formbuilder group intlNumber this nationality Abroad Validators compos
  • 将 merge 转换为 rebase,无需再次执行 merge

    我犯了一个错误 我应该使用git pull rebase 但我发布了一个简单的git pull 合并了所有内容 现在在我的分支的头部有一个合并提交 我想摆脱那个合并提交 我想我只需发出一个git rebase i HEAD 3 将我的最后一
  • JQuery中动态元素的绑定点击事件

    我有一个 div 在通过 html 属性调用 AJAX 调用后动态填充 gallery html imagesHtml insdie imagesHtml 我有 2 个名为 pre btn 和 btn 的按钮 现在我尝试在 JQuery 中
  • VB中如何从long指定的地址获取字符串

    在vba中 有一个由long类型保存的地址 它指向一个以空结尾的字符串 但我找不到从该地址获取字符串的方法 long str address string str 您能解释一下吗 I use CopyMemory这边走 Private De
  • 为什么我的基本默认 .acceptbutton 不起作用?

    我拥有的 我有两个组框 每个组框内都有一个文本框 第三个文本框放置在两个组框的外部 按钮 1 是表单加载时的默认接受按钮 我需要的 当单击按钮 1 或按下 Enter 键 时 我需要按钮 2 成为默认接受按钮 我的问题 尽管我的代码如此 但
  • 通过 HTTP 跟踪 Web 服务器上的文本文件

    寻找有关如何解决以下问题的意见 我的 ColdFusion 9 应用程序有一个简单的记录器 可以将文本写入文件 在我的开发机器上 该文件是本地的 因此我可以使用 tail f 或 CFB 的 TailView 来观看它 我想要一个工具来在它
  • 调用函数:张量“对象”不可调用

    假设我有一个名为test如下 def test X W do stuff return stuff 我称之为使用model test X W 当我第一次调用该函数时 没有收到错误 但是 如果我再次调用该函数 则会收到错误 Tensor ob
  • 如何使用 boost::random_device 生成加密安全的 64 位整数?

    我想做这样的事情 boost random device rd boost random mt19937 64 gen rd boost random uniform int distribution
  • 使用静态数据集作为数据源

    在我的应用程序中 我有一个数据集 其中包含在我的应用程序中以不同形式使用的表 为了能够保持表单之间的并发性 并且不必每次用户打开新表单时都从数据库获取数据 我将 DataSet 作为程序类中的静态字段 如下所示 static class P
  • 在 Haskell 中创建一个列表来计算帕斯卡三角形

    我正在尝试创建一个接受整数的函数m并返回帕斯卡三角形的行数mth row 我已经构建了一个choose函数 它接受两个整数 n 和 k 并返回值 n 选择 k 例如 choose 3 2返回 3 到目前为止 我已经 pascal 0 1 p