gpt4 book ai didi

list - 从 SML 列表中获取最大值

转载 作者:行者123 更新时间:2023-12-05 02:23:34 27 4
gpt4 key购买 nike

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

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 xsinttl_ans 类型,我认为是list 类型。为什么这段代码有效?系统如何评估递归?如果您可以使用 xs = [3, 4, 5] 向我展示其工作原理,那就太好了。

最佳答案

让我先将此代码重写为等效但更易读的版本:

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]) 的评估是如何进行的:从概念上讲,它将减少通过重复替换相应的答案函数定义的分支:

  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'

关于list - 从 SML 列表中获取最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20823378/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com