我正在自学OCaml,而我用于练习的主要资源是Cornell从他们的3110课程中提供的一些问题集。其中一个问题是编写一个反转int的函数(即:1234→4321,-1234→-4321,2→2→-10→-1等)。颠倒OCaml中的int
我有一个有效的解决方案,但我担心,这不完全是地道的OCaml:
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
它可以正常工作在所有情况下,据我所知道的,但它只是似乎严重“ un-OCaml“给我,特别是因为我用两个内部函数遍历整个int长度。所以我只是想知道是否有更多的“OCaml”方式来做到这一点。
为什么不是int - > string - > char数组 - >颠倒的char数组 - > string - >颠倒的int?这不是OCaml,但是我在SML/NJ中做了类似的事情(使用内爆和爆炸哪些OCaml似乎缺少),同时玩弄https://en.wikipedia.org/wiki/Lychrel_number。在函数式编程中将简单的转换链接在一起是相当习惯的。这可能需要对数据进行多次传递,但“避免过早优化”在学习语言时是很好的建议。 –
我没有看到任何关于您的解决方案的单一性。可能有一些更聪明的解决方案,但这是一个不同的问题。 –