我有一個數據結構,尾遞歸在樹上
datatype 'a tree = Leaf | Branch of 'a tree * 'a * 'a tree
,我想寫一些爲了遍歷這棵樹的功能。它沒有關係,所以它可能是treefold : ('a * 'b -> 'b) -> 'b -> 'a tree -> 'b
。我可以寫這個函數是這樣的:
fun treefold f acc1 Leaf = acc1
| treefold f acc1 (Branch (left, a, right)) =
let val acc2 = treefold acc1 left
val acc3 = f (a, acc2)
val acc4 = treefold acc3 right
in acc4 end
但因爲我不可避免地在最後一種情況下兩個分支,這不是一個尾遞歸函數。
是否有可能創建一個,即允許類型簽名被允許擴展以及花費多少?我也懷疑它是否值得嘗試;也就是說,它在實踐中是否會帶來速度上的好處?
看到這個:http://stackoverflow.com/questions/9323036/tail-遞歸函數查找樹的深度 – david