【问题标题】:(Ocaml) How to remove every other element from a list only using List.hd, List.tl, and List.length(Ocaml) 如何仅使用 List.hd、List.tl 和 List.length 从列表中删除所有其他元素
【发布时间】:2021-04-08 00:20:48
【问题描述】:

我有一个需要帮助的 Ocaml 问题,因为我真的无法弄清楚。我对编码并不陌生,但 Ocaml 让我重新考虑我的职业/学术选择。

编写一个从列表中删除所有其他元素的函数。 ['d'; 'o'; '你'; 'C'; 'H'; 'e'; 'C'; '一个'; 'n'; 'o'; 'e'] -> ['d'; '你'; 'H'; 'C'; 'n'; 'e']

必须是递归方法,只能用List.hd、List.tl、List.length,其他都不行。

这是一个删除列表最后一个元素的函数示例:显然应该以类似方式完成:

let rec rm_last_element l = 
    if  List.tl  l = [] 
      then []  
    else List.hd l :: remove_last(List.tl l);;

善良的灵魂可以帮助我解决问题吗?不一定是代码,但只是向我解释清楚你会怎么做?我知道正确的做法是给我提示,让我自己解决,但到目前为止,这已被证明是徒劳的。

非常感谢

【问题讨论】:

  • 你有没有尝试过做任何事情?你连问题的一部分都解决不了吗?就像从列表中删除单个元素一样?还是打印所有其他元素?
  • 我试过了。显然解决方案非常简单,但我就是看不到它。这是我必须做的最后一个 ocaml 问题也无济于事,然后我可以继续前进并忘记这种语言甚至存在。我正在考虑编写一个删除第一个元素的函数,并根据列表的长度是奇数还是偶数来删除它?但我连那个都做不到
  • 我不确定鄙视这种语言来寻求帮助是正确的选择 ;-) 尝试展示你的一些工作,即使是伪代码,我们会帮助你.

标签: ocaml


【解决方案1】:

考虑一下 OCaml 中的列表是什么样的:

[1 ; 4; 6; 3; 8; 9; 10]可以写成1 :: 4 :: 6 :: 3 :: 8 :: 9 :: 10 :: []

我们可以对列表进行模式匹配。 (扩展 Butanium 所展示的内容。)

match [1 ; 4; 6; 3; 8; 9; 10] with
(* The case of an empty list *)    
| [] -> 
(* The case of a list with a single element,
   where the single element has the value 1. *)
| elt :: [] -> 
(* The case of a list with at least two elements, 
   where elt1 is 1, and elt2 is 4 and 
   rest is [6; 3; 8; 9; 10] *)
| elt1 :: elt2 :: rest ->

如果你想删除所有其他元素,每个 case 需要返回什么?如果我们在[6; 3; 8; 9; 10] 上进行相同的匹配,我们会得到什么?在这种情况下,elt1elt2rest 会是什么?

【讨论】:

  • 非常感谢克里斯,您的解释非常简单。一个问题,你知道模式匹配时是否可以做条件语句?假设我正在处理一个包含整数列表的列表:|列表为空 -> 执行此操作 |如果第一个列表(头)有偶数个整数-> 这样做 |如果不是 -> 这样做你知道这是否可能吗?我遇到语法错误,我在网上找不到任何示例。再次感谢,你很有帮助
  • 不客气。我认为您正在寻找的是模式的条件守卫。此页面上有一个关于这些的部分。 link。在您提到的情况下:match lst with [] -> ... | lst when List.length lst mod 2 = 0 -> ... | lst -> ....
  • 如果你觉得这个答案有用,你可能想接受它或投票。
【解决方案2】:

您可以使用这样的路径匹配:

match l with
| x1 :: x2 :: tale -> (* remove x2 :  x1 is the first element x2 the second
   and tale is the rest of the list *) 
| _ -> (* else don't change the list*)

有关路径匹配的更多信息(与 List.hd 和 List.tale 隐式相同,请参阅this link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多