首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >F#中的尾调用优化递归函数

F#中的尾调用优化递归函数
EN

Stack Overflow用户
提问于 2010-09-17 22:03:51
回答 1查看 648关注 0票数 1

可能重复:

Combine memoization and tail-recursion

下面是我编写的代码,使用一个累积变量优化了尾调用

代码语言:javascript
运行
复制
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对象?

还是简单得多,而我只是缺乏经验?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-18 03:24:35

F#允许您定义一个递归值(就像您提到的递归对象),因此如果您有memoize2函数来执行回忆录(使用两个参数的函数--以使其与counter兼容),那么您可以编写:

代码语言:javascript
运行
复制
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"禁用警告。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3739383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档