Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 在F中反转整数#_F# - Fatal编程技术网

F# 在F中反转整数#

F# 在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#中实现此实现?创建一个递归的内部函数,您可以这样调用它 let rever

我正在尝试反转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#中实现此实现?

创建一个递归的内部函数,您可以这样调用它

 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

无论何时,只要有命令式循环,例如
while
就可以将其转换为递归函数。在这种情况下,您需要一个递归调用的内部函数。第一个模式匹配在执行时处理
的终止条件,第二个模式匹配在执行时处理核心

  let revNum number =
    let rec loop rev = function
    | 0 -> rev
    | fwd ->  loop (rev*10 + fwd%10) (fwd/10)
    loop 0 number;;

谢谢你的回答。我还有一个问题。在F#中,递归优于迭代循环吗?如果是,你能告诉我为什么吗?是的。使用递归,通过在下一个递归调用中提供状态更改作为参数,可以避免可变值。函数式语言的吸引力和力量之一是不变性。当您从命令式和默认的可变语言过渡时,这是帮助grok开发函数式语言的首要挑战之一。