【问题标题】:How can I make my code more modular in SML?如何使我的代码在 SML 中更加模块化?
【发布时间】:2021-11-07 19:04:54
【问题描述】:

我正在使用 SML 编程。我的函数接受一个整数,然后用逗号将它拼接成一个列表。例如数字 12345 -> [1,2.3,4,5]。我的问题是如何使我的代码更加模块化。我有点硬编码我的代码。我希望它适用于无限数量的整数。

fun digits(m:int) =
  if m <10 then
    [m]
  else if m < 100 then
    [m div 10] @ [m mod 10]
  else if m > 100 andalso m < 1000 then
    [(m div 10) div 10] @[(m div 10) mod 10] @ [m mod 10]
  else if m > 1000 andalso m < 10000 then
    [((m div 10) div 10) div 10] @ [((m div 10) div 10) mod 10] @ [(m div 10) mod 10] @ [m mod 10]
  else if m > 10000 andalso m < 100000 then
    [(((m div 10) div 10) div 10) div 10] @ [((m div 10) div 10) div 10 mod 10] @ [((m div 10) div 10) mod 10] @ [(m div 10) mod 10] @ [m mod 10]
  else if m > 100000 andalso m < 1000000 then
    [((((m div 10) div 10) div 10) div 10) div 10] @ [(((((m div 10) div 10) div 10) div 10) mod 10) mod 10] @ [((m div 10) div 10) div 10 mod 10] @ [((m div 10) div 10) mod 10] @ [(m div 10) mod 10] @ [m mod 10]
  else if m > 1000000 andalso m < 10000000 then
    [(((m div 10) div 10) div 10) div 10 div 10 div 10] @ [(((m div 10) div 10) div 10) div 10 div 10 mod 10] @ [((m div 10) div 10) div 10 mod 10]@ [((m div 10) div 10) mod 10] @ [(m div 10) mod 10] @ [m mod 10]                                               
  else
    [(m div 10) div 10] @ [(m div 10) mod 10] @ [m mod 10]

【问题讨论】:

  • 可能只有我一个人......但是在编程(函数式或其他方式)时,......无限数量的整数......令人困惑。 any integer 等更合适更合适.. 只是我的一个想法.. 剩下的就看你了.. :-)

标签: sml


【解决方案1】:

想想你要解决的问题。您无法对所有可能性进行硬编码。

让我们考虑一个基本示例:一位数。显然,对于任何小于 10 的输入,结果就是列表中的那个数字。

fun digits m =
  if m < 10 then
    [m]

如果数字大于 10,则可能是两位数,也可能更多。我们不知道。但是我们能找到最小的数字吗?

fun smallestDigit m =
  if m < 10 then
    m
  else
    m mod 10

所以如果我们调用smallestDigit 123,我们会得到3

如果我们123 div 10,我们会得到12。如果我们调用smallestDigit 12,我们会得到2。我们只需要重复这个,直到我们得到所有的数字。在函数式编程中,这种重复通常通过递归来实现。

所以让我们用递归把它放在一起。关键是我们有一个停止递归的退出条件,并且另一种情况收敛到该退出条件。

fun digits m =
  if m < 10 then
    [m]
  else 
    let
      val smallestDigit = m mod 10
      val remainingDigits = m div 10
    in
      digits remainingDigits @ [smallestDigit]
    end

【讨论】:

  • 非常感谢!
  • 如果您觉得这回答了您的问题,请务必为了其他 SO 用户的利益而接受该答案。
猜你喜欢
  • 1970-01-01
  • 2014-05-23
  • 2017-07-01
  • 2011-12-29
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多