【问题标题】:Why is this happening (Ocaml)为什么会发生这种情况(Ocaml)
【发布时间】:2021-01-24 08:36:13
【问题描述】:

在 Ocaml 语言中,目标是在删除重复项的同时合并(附加)两个列表。

let rec find_dup a lst =
  match lst with
    | [] -> false
    | hd::tl -> if (hd == a) then true else find_dup a tl;;
    


let rec app lst2 lst1 =
  match lst1 with
    | [] -> lst2
    | hd::tl -> if (find_dup hd lst2) then (app tl lst2)
     else hd::app tl lst2
     
     
     ;;

我有这样的代码,但是当测试用例是 app [4;5;6;7] [1;2;3;4] 答案应该是 [1;2;3;4;5;6;7] 但我不断得到

  • : 整数列表 = [1; 2; 5个; 3; 6; 4; 7]

发生了什么事?

【问题讨论】:

  • 请不要以使现有答案无效的方式更改问题。我已还原更改,因此您无需执行任何操作,但请不要再执行此操作。

标签: ocaml


【解决方案1】:

您正在为每个递归调用切换列表。

看函数定义的参数顺序:

let rec app lst2 lst1

然后是递归函数调用:

app tl lst2

另外,为了挑剔,find_dup 已经存在于标准库中。它叫做List.mem

【讨论】:

  • 谢谢,所以我不应该让应用程序成为递归函数吗?但是里面有吗?
  • 不,它应该是递归的。但是当你调用它时,你不应该交换参数的顺序。因此,解决方法是将它们交换回来。
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 2010-09-22
  • 1970-01-01
  • 2018-04-27
  • 2013-08-02
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多