far*_*own 3 recursion list sml
我目前正在学习 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
Run Code Online (Sandbox Code Playgroud)
hd xs是类型,int并且tl_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
Run Code Online (Sandbox Code Playgroud)
现在我们可以考虑如何进行评估:从概念上讲,通过重复替换函数定义的相应分支,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
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我已将y内部调用重命名为y'。
| 归档时间: |
|
| 查看次数: |
3020 次 |
| 最近记录: |