首页 > 解决方案 > 为什么此代码不起作用递归函数出错

问题描述

我应该检查两个列表是否是字谜我认为我为该任务制作了正确的代码,但这需要帮助

let rec ana l1 l2 = 
    if l1=[] && l2=[] then true
    else if List.hd l1 = List.hd l2 then  ana (List.tl l1) l2
    else if  List.hd l1 != List.hd l2 then ana l1 (List.tl l2)
    else false;; 

  ana [2;9;4;7] [2;4;7;9];;

标签: ocaml

解决方案


您没有处理一个或另一个列表为空的情况,只有当两者都为空时。因此,当您到达 时else if List.hd l1 = List.hd l2,当l1orl2为空时,List.hd将引发异常,因为它没有为空列表定义。

您可能想改用模式匹配,这样可以避免这种情况并警告您任何丢失的情况。这是使用模式匹配重写的代码。它仍然不能满足您的要求,但至少不会引发异常:

let rec ana l1 l2 =
  match l1, l2 with
  | [], [] ->
    true

  | h1::t1, h2::t2 ->
    if h1 = h2 then
      ana t1 l2
    else
      ana l1 t2

  | _ ->
    false

推荐阅读