我们希望在给定的非空整数列表中找到最大值.然后我们必须比较列表中的元素.由于数据值是作为序列给出的,因此我们可以从列表的开头或结尾进行比较.以两种方式定义.a)从头开始的比较b)从结束的比较(当数据值在列表中时我们怎么做?)
我所做的是从一开始就找到最大的数字.
我怎么能从最后做到这一点?我应该采用什么逻辑?
这是我从头开始比较的代码.
- fun largest[x] = x
= | largest(x::y::xs) =
= if x>y then largest(x::xs) else largest(y::xs)
= | largest[] = 0;
val largest = fn : int list -> int
output
- largest [1,4,2,3,6,5,4,6,7];
val it = 7 : int
Run Code Online (Sandbox Code Playgroud)
在您的函数中,比较列表的前两个元素,并将较大的值与其余元素进行比较.我认为从最后的比较意味着你首先尝试找到列表尾部的最大数量,然后将其与head元素进行比较.
fun largest [] = raise Empty
| largest [x] = x
| largest (x::xs) =
let
val y = largest xs
in
if x > y then x else y
end
Run Code Online (Sandbox Code Playgroud)
虽然不是必需的,但您应该处理空列表的完整性.如果使用max功能,您可以缩短功能.
fun largest [] = raise Empty
| largest [x] = x
| largest (x::xs) = max(x, largest xs)
Run Code Online (Sandbox Code Playgroud)
说实话,我更喜欢你的尾部递归版本(它不会在大型列表上炸掉堆栈).我的函数可以被重写为其他答案所示的尾递归,但肯定比你的函数更复杂.