我目前正在学习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