繁体   English   中英

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

[英]OCaml function to check if list is palindrome with floor(n/2) recursive calls and no list allocation

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

我想出了这个,它的工作原理是:

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)

您可以使用一个递归辅助函数

  • 在进入过程中,有两个参数:列表的其余部分,以及列表的其余部分,其距离要检查的列表的开头的距离是原来的两倍。
  • 在要检查的列表的中间达到基本情况(当第二个列表为空时,或者-在奇数长度的情况下-仅包含一个元素)
  • 在出站的途中,返回一个列表option ,其余的仍然必须反向检查是否相等-如果回文匹配失败,则返回None

例:

// in
hannah hannah
 annah   nnah
  nnah     ah
   nah       
// out
  n <-> nah
 a  <->  ah
h   <->   h

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM