在 F# 中将列表拆分为两个相等的列表

2023-11-27

我对 F# 确实很陌生,我需要一些关于 F# 问题的帮助。

我需要实现一个剪切函数,将列表分成两半,以便输出......

切[1;2;3;4;5;6];;

val it : int 列表 * int 列表 = ([1; 2; 3], [4; 5; 6])

我可以假设列表的长度是偶数。

我还希望定义一个辅助函数 gencut(n, xs) ,它将 xs 切成两部分,其中 n 给出第一部分的大小:

gencut(2, [1;3;4;2;7;0;9]);;

val it : int 列表 * int 列表 = ([1; 3], [4; 2; 7; 0; 9])

我通常不会在这里寻求锻炼帮助,但我真的不知道从哪里开始。任何帮助,即使只是朝正确方向推动,都会有所帮助。

Thanks!


由于您的列表长度均匀,并且您将其干净地切成两半,因此我建议使用以下内容(首先是伪代码):

  • 从两个指针开始:slow and fast.
  • slow一次遍历列表中的一个元素,fast一次步进两个元素。
  • slow将每个元素添加到累加器变量中,同时fast向前移动。
  • 当。。。的时候fast指针到达链表末尾时,slow指针仅步进了元素数量的一半,因此它位于数组的中间。
  • 返回元素slow跨过+剩下的元素。这应该是两个列表,整齐地切成两半。

上述过程需要对列表进行一次遍历,并且运行时间为 O(n)。

由于这是家庭作业,我不会给出完整的答案,但只是为了让您开始一半,以下是将列表彻底削减一半所需的内容:

let cut l =
    let rec cut = function
        | xs, ([] | [_]) -> xs
        | [], _ -> []
        | x::xs, y::y'::ys -> cut (xs, ys)
    cut (l, l)

Note x::xs步骤1元素,y::y'::ys步骤二。

该函数返回列表的后半部分。修改它非常容易,因此它也返回列表的前半部分。

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

在 F# 中将列表拆分为两个相等的列表 的相关文章

随机推荐

  • 为什么 str(reversed(...)) 不给我反转的字符串?

    我正在努力习惯迭代器 为什么如果我输入 b list reversed 1 2 3 4 5 它会给我一个反向列表 但是 c str reversed abcde 不会给我一个反转的字符串吗 在Python中 reversed实际上返回一个反
  • 为什么我的 Runnable Jar 文件不起作用

    我遵循了大约 10 个不同的教程 但似乎没有一个能够解决问题 我的可运行 jar 文件就是无法工作 My 游戏运行良好当我在 eclipse 中运行它时 我是能够将其制作成可运行的 jar 文件仅一两天前 并没有更改太多代码 当我尝试运行
  • 对象内的匿名函数

    我有一个像这样的 Javascript 片段 var a ac 10 function console log hi 浏览器不会为此抛出错误 所以这可能是有效的 但是当我使用 var a ac 10 function hi console
  • Python 脚本的文件名和行号

    如何获取Python脚本中的文件名和行号 正是我们从异常回溯中获取的文件信息 在这种情况下没有引发异常 感谢 mcandre 答案是 python3 from inspect import currentframe getframeinfo
  • 使用 TLS 会话重用将文件上传到 C# 中的隐式 FTPS 服务器

    我正在尝试通过协议 TLS 通过 ftps 将文件上传到 FileZilla 服务器 服务器上的20和21端口被关闭 我设法连接到服务器的唯一方法是使用 FluentFTP 但由于某些 FileZilla 服务器错误 我无法上传文件 htt
  • Firestore 规则模拟器 - 资源未定义

    我正在尝试使用 firebase 提供的新规则模拟器工具 但是在使其正常工作时遇到问题 在模拟器面板中这样设置路径时 users Gd9jd3jd8sSixxx38djSs 然后选择身份验证选项并输入授权用户的 uid 作为相同的字符串 G
  • 将 blob 文件上传到 Amazon s3

    我正在使用 ngCropImage 裁剪图像并希望将其上传this link NgCropImage 指令返回图像的 dataURI 我将其转换为 blob 转换后我得到一个 blob 对象 它具有大小和类型 使用以下代码将 DataURI
  • 如何修复:TypeError“元组”对象不支持项目分配[重复]

    这个问题在这里已经有答案了 本教程的以下代码片段 http www raywenderlich com 24252 beginning game programming for teens with python for badguy in
  • git Push 在 HTTP/1.1 100 之后挂在(哑)https 上继续

    我正在努力推动一些改变 但是git push挂起 当我跑步时git push 我没有看到任何输出 似乎什么也没有发生 没有任何活动top 并且没有发生任何事情的迹象 我不控制 git 托管服务 我正在使用 HTTPS URL 我相信托管服务
  • Tomcat连接池耗尽

    我在我的项目中使用 Apache Tomcat JDBC 连接池 我很困惑 因为在重负载下我不断看到以下错误 12 26 36 410 ERROR http XX XXX XXX X XXXXX X org apache tomcat jd
  • mysqldump 仅转储具有特定前缀的数据库

    我有大约 100 个不同的数据库 我想使用 mysqldump 转储以前缀 asd 开头的数据库 我尝试了这个 但它不起作用 mysqldump u user p pwd h server url asd single transactio
  • 在 Swift 中更改导航栏颜色

    我使用选择器视图来允许用户选择整个应用程序的颜色主题 我计划更改导航栏 背景和可能的选项卡栏的颜色 如果可能的话 我一直在研究如何做到这一点 但找不到任何 Swift 示例 谁能给我一个我需要用来更改导航栏颜色和导航栏文本颜色的代码示例 选
  • Angular 2 - Jquery | Angular 2 - Jquery | Angular 2 - Jquery | Angular 2 - Jquery使用鼠标位置添加样式(上/左)

    我正在寻找一种在 Angular 2 中的特定位置 鼠标事件 x y 添加 div 组件的方法 https jsfiddle net lennartquerter w2c7uqw6 this xPos xPos this yPos yPos
  • 在 Vim 中映射 Esc 键

    I m a beginning Vim user I hate pressing the Esc key which is a little far on my T61 In order to return to command mode
  • Android:EditText 中多行且无自动建议

    是否可以有一个允许多行且不显示建议的 EditText 我尝试使用以下代码 android inputType textFilter textMultiLine 我在这个中看到了question 但这对我不起作用 如果我尝试同时使用两者 E
  • 使用 Lodash 将 JavaScript 数组拆分为块

    我需要将 JavaScript 数组拆分为n大小的块 例如 给定这个数组 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 and a n等于 4 输出应该是这样的 a1 a2 a3 a4 a5 a6 a
  • Jquery——任何事件都会触发动作[重复]

    这个问题在这里已经有答案了 jquery 中是否有任何事件触发时会触发函数的东西 我想要这样的东西 anyEvent function error html on blur change click dblclick error focus
  • WKWebView reload() 无法刷新当前页面

    离线时第一次加载网页失败 然后我连接网络呼叫reload 刷新当前页面 但这不起作用 WKNavigationDelegate无法得到任何回调 功能reloadFromOrigin 也不工作 但医生说 abstract Reloads th
  • .net mvc 中从 Bootstrap 3.7 更新到 5.0.2 产生错误 - System.NullReferenceException

    我卸载了 net MVC 应用程序附带的基本引导模板 并从 NuGetPackage Manager 安装了引导程序 5 0 2 现在我在运行时遇到这个问题 构建正在成功发生 System NullReferenceException HR
  • 在 F# 中将列表拆分为两个相等的列表

    我对 F 确实很陌生 我需要一些关于 F 问题的帮助 我需要实现一个剪切函数 将列表分成两半 以便输出 切 1 2 3 4 5 6 val it int 列表 int 列表 1 2 3 4 5 6 我可以假设列表的长度是偶数 我还希望定义一