如何在F#中实现get Max element函数?
我对F#还是个新手,在一些基本功能上遇到了麻烦。 我得到了一份清单:如何在F#中实现get Max element函数?,f#,F#,我对F#还是个新手,在一些基本功能上遇到了麻烦。 我得到了一份清单: let list1 = [1;2;3;4;5;6;7] 我如何创建一个递归遍历list1并查找最大元素的getMax函数 我最困惑的是我将返回什么以及我将如何遍历列表。类似于,在命令式语言中,您将循环遍历每个项并将最大值存储在变量中,我们编写了一个尾部递归函数,编译器将其转换为一个循环 let getMax list = let rec loop current list = match list
let list1 = [1;2;3;4;5;6;7]
我如何创建一个递归遍历list1
并查找最大元素的getMax
函数
我最困惑的是我将返回什么以及我将如何遍历列表。类似于,在命令式语言中,您将循环遍历每个项并将最大值存储在变量中,我们编写了一个尾部递归函数,编译器将其转换为一个循环
let getMax list =
let rec loop current list =
match list with
| [] -> current
| head::tail -> loop (if head > current then head else current) tail
loop (List.head list) list
这是冗长的,但这是一个很好的起点。
当然总是有
List.max
和List.maxBy
,但理解循环的模拟是它的一个重要部分。基于给出的理由,我不同意结束这个问题。我看不出它是如何没有重点的,因为这是一个非常简单的问题,需要一个非常简单的解决方案,并且需要关于解决方案的非常具体的细节。它怎么能比这更集中?此外,OP是一个新的贡献者。我同意@BentTranberg。我稍微调整了一下措辞,希望它能重新开放。投票决定重新开放。关闭这是一个错误。为什么要递归?已可用,并在列表为空时抛出。并使用可变变量将找到的最大值保持在该点之前。列表本身使用循环和volatileacc
变量,因为像max
和min
这样的函数对于所有应用程序来说都是性能关键的。F#中的大多数核心操作在内部使用可变状态,有些使用内联IL。当编译器是自托管的时,这一点非常重要。但是上面的代码被编译器翻译成一个带有可变变量的while循环。F#是一种多范式语言,它不会强迫您编写不可变的代码,但通过具有不可变的语义,您可以获得更安全的代码,并让编译器完成其工作。热点始终可以在以后分析。