Я очень зелёный, когда дело доходит до F #, и я столкнулся с небольшой проблемой, связанной с рекурсивными функциями, которые, как я надеялся, могут помочь мне понять.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», поскольку функция является рекурсивной (так почему бы и нет?) И почему первая версия функции выполняется навсегда?
EDIT
Оказывается, это был полный нуб ошибка. Я создал несколько определений функции на этом пути, как объясняется в комментариях + ответах.
Первый образец работает отлично на моей машине. Какой вклад вы используете, и какую версию F # вы используете? – JaredPar
Я до сих пор использую F # interactive в VS 2012 –
У вас, по-видимому, есть несколько определений 'nextEven'. Это единственное объяснение для второй функции, работающей (и, вероятно, для первой, которая не возвращается). Попробуйте сбросить FSI. – Daniel