簡體   English   中英

OCaml-尾遞歸將數組轉換為列表

[英]OCaml - Tail Recursion to convert array to list

我想用尾部遞歸輔助函數編寫函數以將數組轉換為列表。

例:

#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操作。

第四個問題是您使用List.tl在每次迭代中都丟棄了alist的頭,這將在第一次迭代中失敗,因為alist最初是空的。 如果不是這樣, alist永遠只能包含處理的最后一個元素。

我希望這能給您足夠的機會去解決它。 基本思想似乎很好; 您只需要清除錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM