【发布时间】:2023-03-25 09:00:01
【问题描述】:
我有一个函数,其中星号线是涉及递归调用的连词。当连词起作用时,如果h1 <> h2 则不会进行递归调用。但是如果调用了,那么编译器是否仍会回溯并在true 值上执行一大堆连词?还是会省略这个不必要的步骤?
换句话说,以下函数是否有效地尾递归?
let isExtensionOf<'A when 'A : equality> (lst1 : list<'A>) (lst2 : list<'A>) : bool =
let rec helper (currLst1 : list<'A>) (currLst2 : list<'A>) : bool =
match currLst1, currLst2 with
| h1 :: _, [] -> false
| [], _ -> true
| h1 :: t1, h2 :: t2 -> (h1 = h2) && (helper t1 t2) // *
helper lst1 lst2
是的,我知道星号线应该写成if h1 = h2 then helper t1 t2 else false。但我只是好奇。
提前致谢。
【问题讨论】:
-
回答这类问题的最简单方法是:输入一个你认为会引发病态行为的巨大列表,然后看看会发生什么。
-
我宁愿编译它,然后用 ILSpy 查看生成的代码。更可靠。另请注意,根据是否启用优化,结果可能会有所不同。
-
嗯,它处理了
1,00,000,000(一亿)的基数列表,没有眨眼,所以我只是假设我的问题可以得到肯定的回答。
标签: recursion f# tail-recursion