遞歸函數:如何此功能轉換爲使用尾調用
let rec listMerge (l1 : 'a list) (l2 : 'a list) =
if l1.IsEmpty then l2
elif l2.IsEmpty then l1
else l1.Head :: l2.Head :: listMerge l1.Tail l2.Tail
現在,除非我很高興地看錯,這實際上並不執行尾調用,它只是看起來好像沒有,如果不是考慮到::
是正確的聯想。
然後,我的印象(從我讀的東西,但現在找不到),這可以很容易地轉換爲尾部遞歸通過使用額外fun
什麼的。
那麼,有可能嗎?碼?
我的回答:所以,這是我如何改變功能,這要歸功於以下答案:
let listMerge l1 l2 =
let rec mergeLoop (l1 : 'a list) (l2 : 'a list) acc =
if l1.IsEmpty then (List.rev acc) @ l2
elif l2.IsEmpty then (List.rev acc) @ l1
else mergeLoop l1.Tail l2.Tail (l2.Head :: l1.Head :: acc)
mergeLoop l1 l2 []
我建議你閱讀模式匹配。它會讓你的co更可讀和更乾淨。 –
如果你的意思是'match',我也有使用它的版本,雖然我認爲這個版本更具可讀性,但是大聲朗讀它幾乎是簡單的英語......雖然IL完全不同,但我想知道是否應該發佈另一個問題是哪個更有效。 – hyde
一般來說,模式匹配(在'match','let','use','fun'','function'等中)對於函數代碼更實用。它也會讓你做更復雜的事情,如果不行的話。 –