【问题标题】:SML: How to recursively halve an integer n using only +1 and -1SML:如何仅使用 +1 和 -1 递归地将整数 n 减半
【发布时间】:2023-10-02 20:17:01
【问题描述】:

如何在 SML 中递归拆分数字 n?

  fun halves (n : int) : int * int =  
  let val x = 0
    val y = x+1
  in 
  case n of
    x =>  (n,x)
    |y => (n,y)
    |_ => halves(n-1)
  end

【问题讨论】:

    标签: recursion sml


    【解决方案1】:

    这是作业题吗?

    您发布的代码实际上没有意义,因为这三种情况是多余的:模式“x”匹配所有内容,“y”也是如此,“_”也是如此。如果要检查 0,只需在模式中写入 0。在您的代码中,x 的值始终为 0,y 的值始终为 1。

    这里有一个提示:如果你有两个互相调用的函数(相互递归)怎么办?你可以用 fun 来定义那些......并且,比如:

    fun f (a, b) = g (b, a)
    and g (a, b) = f (a + b, a - b)
    

    (当然,这只是永远循环)。

    【讨论】:

      【解决方案2】:

      你应该仔细考虑你的基础和你的递归步骤。

      基础很简单:halves 0 = (0,0)

      对于递归步骤——问问自己你会怎么做,例如使用halves 11 = (5,6) 计算halves 12 的事实?同样,您将如何使用halves 12 = (6,6) 来计算halves 13?一般来说,如果让(a,b)halves (n-1),那么ab 是什么halves n

      【讨论】: