OCaml - 将数组转换为列表的尾递归

学生会

我想用尾递归辅助函数编写函数来将数组转换为列表。

例子:

#arraytolist  [|"a";"b"|];;
- :string list = ["a";"b"]
#arraytolist  [||];;
- :'alist = []

这是我的代码:

let arraytolist arr = 
    let rec helper alist index = 
        if arr = [||] then []
        else helper (arr.(index))::(List.tl alist) index+1
    in helper [] 0;;

Error: This expression has type int -> 'a list
       but an expression was expected of type 'a
       The type variable 'a occurs inside int -> 'a list
格伦斯尔

您的代码存在多个问题。

第一个也是最直接的问题是您没有helper正确地将递归调用的参数放在括号中如果有疑问,您应该将整个论点放在括号中。我认为这是目前解析它是这样的:(helper arr.(index)) :: (((List.tl alist) index) + 1)

第二个是你的基本情况是arr = [||]arr永远不会改变。所以这只有在arr最初为空时才为真,否则递归不会终止。除非当然index越界并导致程序崩溃,因为您没有检查它,否则它会崩溃。

第三个问题是您的函数将始终返回一个空列表,因为这是您在基本情况下返回的内容(如果其条件正确)。你所做的其他一切都被丢弃了。有一种方法可以编写您的函数,在这种情况下,返回一个空列表作为基本情况确实有意义,而且您似乎正在尝试这样做,但这种方法不会是尾递归的。您希望递归调用是每次迭代的最后一个操作,而不是对递归调用结果的 cons 操作。

第四个问题是您alist在每次迭代中都使用 using丢弃了头部List.tl,这将在第一次迭代时失败,因为alist最初是空的。如果不是,alist将只包含处理的最后一个元素。

我希望这足以让您继续了解它。潜在的想法似乎不错;你只需要清除错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章