Functional programming 在OCaml中反转int
我在自学OCaml,我在实践中使用的主要资源是康奈尔大学在3110课上提供的一些习题集。其中一个问题是编写一个函数来反转int(即:1234->4321,-1234->-4321,2->2,-10->-1等) 我有一个可行的解决方案,但我担心它不是完全惯用的OCaml:Functional programming 在OCaml中反转int,functional-programming,ocaml,Functional Programming,Ocaml,我在自学OCaml,我在实践中使用的主要资源是康奈尔大学在3110课上提供的一些习题集。其中一个问题是编写一个函数来反转int(即:1234->4321,-1234->-4321,2->2,-10->-1等) 我有一个可行的解决方案,但我担心它不是完全惯用的OCaml: let rev_int (i : int) : int = let rec power cnt value = if value / 10 = 0 then cnt else power (10 * cnt
let rev_int (i : int) : int =
let rec power cnt value =
if value / 10 = 0 then cnt
else power (10 * cnt) (value/10) in
let rec aux pow temp value =
if value <> 0 then aux (pow/10) (temp + (value mod 10 * pow)) (value / 10)
else temp in
aux (power 1 i) 0 i
让rev_int(i:int):int=
让rec为cnt值加幂=
如果值/10=0,则cnt
其他功率(10*cnt)(值/10)英寸
让记录辅助功率温度值=
如果值为0,则为辅助(功率/10)(温度+(功率值mod 10*pow))(功率/10)
其他临时雇员
辅助(电源1 i)0 i
据我所知,它在所有情况下都能正常工作,但对我来说,它似乎是严重的“unocaml”,特别是因为我用两个内部函数两次遍历int的长度。所以我只是想知道是否有一种更“OCaml”的方法来实现这一点 我可以向您推荐一些方法:
let decompose_int i =
let r = i / 10 in
i - (r * 10) , r
这个函数允许我像分解列表一样分解整数。
例如,1234
被分解为4
和123
。
然后我们把它倒过来
let rec rev_int i = match decompose_int i with
| x , 0 -> 10 , x
| h , t ->
let (m,r) = rev_int t in
(10 * m, h * m + r)
这里的想法是返回10
,100
,1000
。。。以此类推,以知道最后一位数字的位置
我想在这里做的是像对待列表一样对待它们,
将int分解为List.hd
和List.tl
等价物。
(* [rev x] returns such value [y] that its decimal representation
is a reverse of decimal representation of [x], e.g.,
[rev 12345 = 54321] *)
let rev n =
let rec loop acc n =
if n = 0 then acc
else loop (acc * 10 + n mod 10) (n / 10) in
loop 0 n
但正如杰弗里在评论中所说,你的解决方案非常地道,尽管不是最好的
顺便说一句,我自己的风格是这样写的:
let rev n =
let rec loop acc = function
| 0 -> acc
| n -> loop (acc * 10 + n mod 10) (n / 10) in
loop 0 n
因为我更喜欢模式匹配而不是if/then/else
。但这是我个人喜好的问题。为什么不使用int->string->char-array->reversed char-array->string->reversed int?它不是OCaml,但我在SML/NJ中做过类似的事情(使用OCaml似乎缺少的内爆和爆炸),同时也在玩。将简单的转换链接在一起在函数式编程中是相当惯用的。这可能需要多次传递数据,但在学习一门语言时,“避免过早优化”是一个很好的建议。也许还有一些更聪明的解决方案,但这是另一个问题;这与我的设想是一致的。关于其他答案,我可能应该在我的帖子中提到,我试图避免使用“内置”函数,如string of int。