SML:如何仅使用+1和-1递归地减半整数n

时间:2015-09-19 19:08:17

标签: recursion sml

如何在SML中递归分割数字?

  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

2 个答案:

答案 0 :(得分:2)

这是作业问题吗?

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

这是一个提示:如果你有两个相互调用的函数(相互递归)怎么办?你可以定义那些有趣的......以及:

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

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

答案 1 :(得分:0)

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

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

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