我目前正在學習F#(通過try f#網站)。 我有以下(imho)一元謂詞存在量化的尾遞歸函數(int-> bool)。尾遞歸和布爾運算符
let rec exists bound predicate =
if (bound<0) then false
elif predicate(bound) then true
else exists (bound-1) predicate
現在,這個功能也可以寫成
let rec exists bound predicate = (bound+1>0) && (predicate(bound) || exists (bound-1) predicate)
然而,第二個實現不是尾遞歸。問題是編譯器是否將它優化爲尾遞歸?
如何是更簡單的情況(好吧,這是一個有點傻)的例子,說
let rec hasNoRoot f =
if (f x = 0) then false
else hasNoRoot (fun x -> f (x+1))
與
let rec hasNoRoot f = (f 0 <> 0) && (hasNoRoot (fun x-> f(x+1)))
在第二個例子
,爲了識別功能(它的描述實際上)作爲尾遞歸,編譯器只需要「知道」爲了評估一個連接點,不一定必須評估兩個連接詞。
感謝您的任何意見
的可能重複[?可一個功能,即使有多個不同的遞歸調用尾遞歸優化(HTTP://計算器。 com/questions/15031382/can-a-function-be-optimized-for-tail-recursion-even-when-there-more-one) – joce 2013-04-06 21:54:06
@Joce雖然這個問題與你有一些相似之處,但它與衆不同足以保證保持開放。 – 2013-04-06 22:06:19