正如我在最近的 SO question中提到的,我正在通过Project Euler问题学习 F#。
我现在对问题 3有一个有效的答案,如下所示:
let rec findLargestPrimeFactor p n =
if n = 1L then p
else
if n % p = 0L then findLargestPrimeFactor p (n/p)
else findLargestPrimeFactor (p + 2L) n
let result = findLargestPrimeFactor 3L 600851475143L
但是,由于有 2 个执行路径可能导致对 的不同调用findLargestPrimeFactor
,我不确定它是否可以针对尾递归进行优化。所以我想出了这个:
let rec findLargestPrimeFactor p n =
if n = 1L then p
else
let (p', n') = if n % p = 0L then (p, (n/p)) else (p + 2L, n)
findLargestPrimeFactor p' n'
let result = findLargestPrimeFactor 3L 600851475143L
由于只有一条路径导致对 的尾调用findLargestPrimeFactor
,我认为它确实会针对尾递归进行优化。
所以我的问题:
- 即使有两个不同的递归调用,第一个实现是否可以针对尾递归进行优化?
- 如果两个版本都可以针对尾递归进行优化,那么是否有一个比另一个更好(更“功能”、更快等)?