#f#
#f#
Вопрос:
Я пытаюсь обратить целое число в F #. У меня есть следующий подход:
//let the number be n
rev = 0
while(n != 0){
rev = rev * 10 n % 10;
n /= 10;
}
// rev now contains the reverse integer of n
Я новичок в F #, и я не знаю идиоматического синтаксиса для достижения этой реализации. Я не хочу обращать число вспять, сначала преобразуя его в строку. Как эта реализация может быть выполнена в F # идиоматическим способом?
Ответ №1:
Создайте рекурсивную внутреннюю функцию, которую вы вызываете следующим образом.
let reverse n =
let rec revInner n rev =
match n with
| 0 -> rev
| _ -> revInner (n / 10) (rev * 10 n % 10)
revInner n 0
reverse 43221 // -> 12234
Ответ №2:
Всякий раз, когда у вас есть императивные циклы, такие как while
поиск, чтобы преобразовать его в рекурсивную функцию. В этом случае вам нужна внутренняя функция, которая вызывается рекурсивно. Первое сопоставление с шаблоном относится к условию завершения while
, второе относится к выполнению ядра while
:
let revNum number =
let rec loop rev = function
| 0 -> rev
| fwd -> loop (rev*10 fwd%10) (fwd/10)
loop 0 number;;
Комментарии:
1. Спасибо за ваш ответ. У меня был другой запрос. Является ли рекурсия предпочтительнее итеративных циклов в F #? Если да, не могли бы вы сказать мне, почему?
2. Да, это так. С помощью рекурсии вы можете избежать изменяемых значений, указав изменения состояния в качестве параметра при следующем рекурсивном вызове. Одним из преимуществ и преимуществ функциональных языков является неизменность. При переходе от императивного и изменяемого по умолчанию языка это одна из первых проблем, помогающих создать функциональный язык.