【发布时间】:2013-04-02 19:01:43
【问题描述】:
我对 F# 非常陌生,我遇到了一个处理递归函数的小问题,希望能帮助我理解。
我有一个函数应该吐出下一个偶数:
let rec nextEven(x) =
let y = x + 1
if y % 2 = 0 then y
else nextEven y
// This never returns..
nextEven 3;;
我使用 'rec' 关键字,以便它是递归的,虽然当我使用它时,它会出于某种原因在无限循环中运行。如果我这样重写函数:
let nextEven(x) =
let y = x + 1
if y % 2 = 0 then y
else nextEven y
然后一切正常(没有 rec 关键字)。出于某种原因,我虽然需要'rec',因为该函数是递归的(那为什么不呢?),为什么该函数的第一个版本会永远运行?
编辑
事实证明这是一个完全的菜鸟错误。正如 cmets + answers 中所解释的那样,我一路创建了函数的多个定义。
【问题讨论】:
-
第一个示例在我的机器上运行良好。你给它什么输入,你使用什么版本的 F#?
-
我目前在 VS 2012 中使用 F# 交互
-
您显然有多个可用的
nextEven定义。这是第二个函数工作的唯一解释(可能是第一个不返回的函数)。尝试重置 FSI。 -
这对我来说在相同的环境中效果很好。我将第一个示例复制 + 粘贴到 F# 文件中,将其发送到交互式然后执行
nextEven 3;; -
示例 1 也适用于 tryfsharp.org/Create
标签: f# f#-interactive