F#: 相互递归函数

12

可能是重复的问题:
[F#] 如何让两个方法相互调用?

大家好,

我有一个场景,其中有两个函数可以从相互递归中受益,但我不确定如何在F#中实现这一点。

我的情况并不像以下代码那么简单,但我希望得到类似编译的东西:

let rec f x =
  if x>0 then
    g (x-1)
  else
    x

let rec g x =
  if x>0 then
    f (x-1)
  else
    x

请参见https://dev59.com/qXM_5IYBdhLWcg3wcCrc。 - Brian
我犹豫是否将此标记为重复,因为标题可能更好... - Benjol
@Benjol:通常情况下,我们不会删除标题有很大不同的重复内容,以提高搜索性能,但我们仍会将其关闭。 - dmckee --- ex-moderator kitten
3个回答

29

你还可以使用 let rec ... and 形式:

let rec f x =
  if x>0 then
    g (x-1)
  else
    x

and g x =
  if x>0 then
    f (x-1)
  else
    x

1
你比我快42秒... :-) - J D
1
+1,很好,我之前没有意识到在let绑定中也可以使用“and”。我原以为它的用法只限于“type”声明。 - JaredPar
如果您有相互递归的类型(例如两个DUs)和两个函数,每个函数都将其作为输入参数,则这非常有用(必要)。 - elmattic

2
要实现相互递归的函数,只需将一个函数作为参数传递给另一个函数即可。
let rec f g x =
  if x>0 then
    g (x-1)
  else
    x

let rec g x =
  if x>0 then
    f g (x-1)
  else
    x

2
使用let rec ... and ...结构:
let rec f x =
  if x>0 then
    g (x-1)
  else
    x

and g x =
  if x>0 then
    f (x-1)
  else
    x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接