如何在不炸掉堆棧的情況下計算陣列的長度?我的兩次嘗試不看對我好計算陣列的長度而不會炸掉堆棧
let rec slowComputeLength xs = match xs with
| x::xss -> 1 + slowComputeLength xss
| _ -> 0
let computeLength xs = List.fold (fun acc _ -> acc + 1) 0 xs
我能想到通過蓄能器在模式匹配的第一個版本,但是,使API醜陋
let rec slowComputeLength xs acc = match xs with
| x::xss -> slowComputeLength xss acc+1
| _ -> 0
是List.fold的正確方法還是創造了一些類似於下面的東西,我相信它也是一樣?
(1 + (1 + (1 + (...))))?
PS - 我在做這個練習,理想情況下我們應該使用Array.Length。
啊是的,這是一個練習。我想補充一點。 :) –
哇,表達式'slowComputeLength xss acc + 1'是* evil *。與'_ - > 0'一起,它實際上導致了正確的結果,但完全沒有做它看起來應該做的事情。這不是尾遞歸:請注意,函數應用比'+'運算符具有更高的優先級! – Vandroiy
'List.fold'循環,可能是通過尾遞歸在發佈的答案,所以它不會吹堆棧。 – phoog