可能重复:
Combine memoization and tail-recursion
下面是我编写的代码,使用一个累积变量优化了尾调用
let rec counter init count =
if init = 1 then count + 1 else
match init with
| Even value -> (counter (value/2) (1 + count))
| Odd value -> (counter ((3 * value) + 1) (count+1))
let SeqBuilder (initval:int) : int =
counter initval 0我怎么回忆录这个?当我尝试回忆录时遇到的问题是递归调用必须转到回忆录对象,所以您必须拥有a...recursive对象?
还是简单得多,而我只是缺乏经验?
发布于 2010-09-18 03:24:35
F#允许您定义一个递归值(就像您提到的递归对象),因此如果您有memoize2函数来执行回忆录(使用两个参数的函数--以使其与counter兼容),那么您可以编写:
let rec counter = memoize2 (fun init count ->
if init = 1 then count + 1 else
match init with
| Even value -> (counter (value/2) (1 + count))
| Odd value -> (counter ((3 * value) + 1) (count+1)) )这样的递归引用可能很危险,因此F#会插入一些运行时检查。它还提供了一个警告FS0040来通知您这一点,但在这种情况下,递归是正确的(如果在初始化期间访问递归引用,就会出现问题--在这里,我们只是在函数已经声明时才使用它,所以一切都很好)。可以通过添加#nowarn "40"禁用警告。
https://stackoverflow.com/questions/3739383
复制相似问题