Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List OCaml函数,用于检查列表是否是回文的,有楼层(n/2)递归调用且没有列表分配_List_Ocaml_Palindrome - Fatal编程技术网

List OCaml函数,用于检查列表是否是回文的,有楼层(n/2)递归调用且没有列表分配

List OCaml函数,用于检查列表是否是回文的,有楼层(n/2)递归调用且没有列表分配,list,ocaml,palindrome,List,Ocaml,Palindrome,我在uni上有这个任务,我已经研究了很长时间,但我不知道如何编写这个函数。 我需要它来检查一个列表是否是回文,最多递归调用floor(n/2)次,并且不分配任何辅助列表(因此我可以不使用列表构造函数)。 有什么想法吗?Tbh,我想要一个算法而不是完整的解决方案。您可以使用 在输入的过程中,接受两个参数:列表的剩余部分,以及距离要检查的列表起点两倍的列表的剩余部分 在要检查的列表中间(当第二个列表变空,或者在奇数长度的情况下,只有一个元素)到达它的基础情况。 在退出时,为列表返回一个选项,剩余部

我在uni上有这个任务,我已经研究了很长时间,但我不知道如何编写这个函数。 我需要它来检查一个列表是否是回文,最多递归调用floor(n/2)次,并且不分配任何辅助列表(因此我可以不使用列表构造函数)。
有什么想法吗?Tbh,我想要一个算法而不是完整的解决方案。

您可以使用

  • 在输入的过程中,接受两个参数:列表的剩余部分,以及距离要检查的列表起点两倍的列表的剩余部分
  • 在要检查的列表中间(当第二个列表变空,或者在奇数长度的情况下,只有一个元素)到达它的基础情况。
  • 在退出时,为列表返回一个
    选项
    ,剩余部分仍需反向检查是否相等,或者在回文不匹配时返回
    None
例如:

// in
hannah hannah
 annah   nnah
  nnah     ah
   nah       
// out
  n <-> nah
 a  <->  ah
h   <->   h
//in
汉娜汉娜
安娜娜娜
nnah
不
//出去
n不
啊
h h

您可以使用递归助手函数

  • 在输入的过程中,接受两个参数:列表的剩余部分,以及距离要检查的列表起点两倍的列表的剩余部分
  • 在要检查的列表中间(当第二个列表变空,或者在奇数长度的情况下,只有一个元素)到达它的基础情况。
  • 在退出时,为列表返回一个
    选项
    ,剩余部分仍需反向检查是否相等,或者在回文不匹配时返回
    None
例如:

// in
hannah hannah
 annah   nnah
  nnah     ah
   nah       
// out
  n <-> nah
 a  <->  ah
h   <->   h
//in
汉娜汉娜
安娜娜娜
nnah
不
//出去
n不
啊
h h

我想出了这个方法,它可以工作:

let palindrom l =
let rec aux l0 l1 =
    match (l0, l1) with
    | _,[] -> (true,[])
    | hd :: tl, [x] -> (hd = x, tl)
    | _, hd1 :: tl1 -> let (pal, ll) = aux l0 tl1 in
          match ll with
          | [] -> (pal, [])
          | hd::tl -> (pal && hd1 = hd, tl) in
match l with
[] -> true
| _ -> fst (aux l l)

我已经想出了一个办法,它是有效的:

let palindrom l =
let rec aux l0 l1 =
    match (l0, l1) with
    | _,[] -> (true,[])
    | hd :: tl, [x] -> (hd = x, tl)
    | _, hd1 :: tl1 -> let (pal, ll) = aux l0 tl1 in
          match ll with
          | [] -> (pal, [])
          | hd::tl -> (pal && hd1 = hd, tl) in
match l with
[] -> true
| _ -> fst (aux l l)

见附件:3。要求家庭作业帮助的问题必须包括到目前为止你为解决问题所做工作的总结,以及对你解决问题的困难的描述。“我已经研究了很长时间”是不够的。不确定这是否是预期的解决方案,但继续下去肯定可以解决这个问题。(它基本上是分配一个链表,而不使用显式Cons)你能使用
长度吗?@Bergi不,我不能。而continuations将不起作用,因为隐式分配也是不允许的。那么我唯一能想象的是一个递归函数,它每次调用消耗2个列表元素,以找到列表的中间部分。请参见:3。要求家庭作业帮助的问题必须包括到目前为止你为解决问题所做工作的总结,以及对你解决问题的困难的描述。“我已经研究了很长时间”是不够的。不确定这是否是预期的解决方案,但继续下去肯定可以解决这个问题。(它基本上是分配一个链表,而不使用显式Cons)你能使用
长度吗?@Bergi不,我不能。而continuations将不起作用,因为隐式分配也是不允许的。那么我唯一能想象的是一个递归函数,它每次调用消耗2个列表元素,以找到列表的中间部分。