我所做的是从一开始就通过比较找到最大的数字。
我怎样才能从头做起?我应该应用什么逻辑?
这是我从头开始比较的代码。
- 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
最佳答案
在您的函数中,比较列表的前两个元素,并将较大的值与其余元素进行比较。我认为从末尾进行比较意味着您首先尝试找到列表尾部的最大数字,然后再将其与头部元素进行比较。
fun largest [] = raise Empty
| largest [x] = x
| largest (x::xs) =
let
val y = largest xs
in
if x > y then x else y
end
虽然不是必需的,但为了完整起见,您应该处理空列表的情况。如果使用
max
函数,您可以缩短该函数。fun largest [] = raise Empty
| largest [x] = x
| largest (x::xs) = max(x, largest xs)
老实说,我更喜欢你的尾递归版本(它不会在大列表上炸毁堆栈)。正如其他答案所示,我的函数可以重写为尾递归,但它肯定比您的函数更复杂。
关于list - 如何在 SML 的 List 中找到最大的数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12522803/