【发布时间】: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
【问题讨论】:
如何在 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
【问题讨论】:
这是作业题吗?
您发布的代码实际上没有意义,因为这三种情况是多余的:模式“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)
(当然,这只是永远循环)。
【讨论】:
你应该仔细考虑你的基础和你的递归步骤。
基础很简单:halves 0 = (0,0)
对于递归步骤——问问自己你会怎么做,例如使用halves 11 = (5,6) 计算halves 12 的事实?同样,您将如何使用halves 12 = (6,6) 来计算halves 13?一般来说,如果让(a,b) 为halves (n-1),那么a 和b 是什么halves n?
【讨论】: