我所做的是从一开始就通过比较找到最大的数字。

我怎样才能从头做起?我应该应用什么逻辑?

这是我从头开始比较的代码。

- 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/

10-10 19:50