Обращение целого числа в F#

#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. Да, это так. С помощью рекурсии вы можете избежать изменяемых значений, указав изменения состояния в качестве параметра при следующем рекурсивном вызове. Одним из преимуществ и преимуществ функциональных языков является неизменность. При переходе от императивного и изменяемого по умолчанию языка это одна из первых проблем, помогающих создать функциональный язык.