首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SML中的列表中获取最大值

从SML中的列表中获取最大值
EN

Stack Overflow用户
提问于 2013-12-29 08:20:05
回答 1查看 2.5K关注 0票数 3

我目前正在学习SML,我很难理解下面的代码

代码语言:javascript
复制
fun good_max (xs : int list) =
  if null xs
  then 0
  else if null (tl xs)
  then hd xs
  else
    (* for style, could also use a let-binding for (hd xs) *)
    let val tl_ans = good_max(tl xs)
    in
      if hd xs > tl_ans
      then hd xs
      else tl_ans
    end

hd xsint型和tl_ans型,我认为是list型。为什么这段代码能工作?系统如何评估递归?如果您可以使用xs = [3, 4, 5]向我展示这是如何工作的,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-29 09:10:26

首先,让我将这段代码重写成一个等价但更易读的版本:

代码语言:javascript
复制
fun max(x,y) = if x > y then x else y

fun goodMax(nil) = 0
  | goodMax(x::nil) = x
  | goodMax(x::xs) = let val y = goodMax(xs) in max(x,y) end

现在,我们可以考虑goodMax([3,4,5])的评估是如何进行的:从概念上讲,它将通过重复替换函数定义的各个分支来简化为一个答案:

代码语言:javascript
复制
  goodMax([3,4,5])
= goodMax(3::[4,5])
= let val y = goodMax([4,5]) in max(3, y) end
= let val y = goodMax(4::[5]) in max(3, y) end
= let val y = (let val y' = goodMax([5]) in max(4, y') end) in max(3, y) end
= let val y = (let val y' = goodMax(5::nil) in max(4, y') end) in max(3, y) end
= let val y = (let val y' = 5 in max(4, y') end) in max(3, y) end
= let val y = max(4, 5) in max(3, y) end
= let val y = (if 4 > 5 then 4 else 5) in max(3, y) end
= let val y = 5 in max(3, y) end
= max(3, 5)
= if 3 > 5 then 3 else 5
= 5

为了清晰起见,我在内部调用中将y重命名为y'

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20823378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档