简单 ML 标准中的递归
Recursion In simple ML Standard
fun max (xs : int list)=
if null xs
then NONE
else
let val tl_ans = max(tl xs)
in
if isSome tl_ans andalso valOf tl_ans > hd xs
then
tl_ans
else
SOME (hd xs)
end
根据我的理解,我无法弄清楚这个程序是如何工作的:
我们输入 else 然后我们递归地调用 max(tl xs) 直到它命中 none 所以当我们有 none 我们检查 in 中的 if 并且它将是 false 然后我们 return 一些(高清 xs)。
问题是我无法理解这个程序是如何逐行工作的我觉得我错过了什么。
我怀疑你犯的错误是试图同时推理多个递归。
一次只关注一个函数调用。
示例:
max []
就是NONE
,如你所说。
接下来以max [2]
为例
这是
let val tl_ans = max []
in
if isSome tl_ans andalso valOf tl_ans > 2
then
tl_ans
else
SOME 2
end
也就是
if isSome NONE andalso valOf NONE > 2
then
NONE
else
SOME 2
这显然是 SOME 2
。
下一步,试试max [3,2]
这是
let val tl_ans = max [2]
in
if isSome tl_ans andalso valOf tl_ans > 3
then
tl_ans
else
SOME 3
end
你知道 max [2]
是 SOME 2
,所以这是
if isSome (SOME 2) andalso valOf (SOME 2) > 3
then
SOME 2
else
SOME 3
即SOME 3
.
等等...
fun max (xs : int list)=
if null xs
then NONE
else
let val tl_ans = max(tl xs)
in
if isSome tl_ans andalso valOf tl_ans > hd xs
then
tl_ans
else
SOME (hd xs)
end
根据我的理解,我无法弄清楚这个程序是如何工作的: 我们输入 else 然后我们递归地调用 max(tl xs) 直到它命中 none 所以当我们有 none 我们检查 in 中的 if 并且它将是 false 然后我们 return 一些(高清 xs)。 问题是我无法理解这个程序是如何逐行工作的我觉得我错过了什么。
我怀疑你犯的错误是试图同时推理多个递归。
一次只关注一个函数调用。
示例:
max []
就是NONE
,如你所说。
接下来以max [2]
为例
这是
let val tl_ans = max []
in
if isSome tl_ans andalso valOf tl_ans > 2
then
tl_ans
else
SOME 2
end
也就是
if isSome NONE andalso valOf NONE > 2
then
NONE
else
SOME 2
这显然是 SOME 2
。
下一步,试试max [3,2]
这是
let val tl_ans = max [2]
in
if isSome tl_ans andalso valOf tl_ans > 3
then
tl_ans
else
SOME 3
end
你知道 max [2]
是 SOME 2
,所以这是
if isSome (SOME 2) andalso valOf (SOME 2) > 3
then
SOME 2
else
SOME 3
即SOME 3
.
等等...