List F#:在非空列表中查找较大值的递归函数

List F#:在非空列表中查找较大值的递归函数,list,recursion,f#,highest,List,Recursion,F#,Highest,我需要一个F#中的递归函数,它给我一个非空列表的最大值。 例如: 我应该9点回来 更新1 我正在学习递归函数,这是本书中的练习,没有答案。我觉得可以在这里问,但似乎这不是一个好主意。好吧,我没有写任何代码示例,所以它似乎是一个懒惰的家伙的家庭作业练习。无论如何,这是我最好的尝试: let rec highest l = match l with |[] -> 0 |x::y::xs -> if x > y then highest x::xs

我需要一个F#中的递归函数,它给我一个非空列表的最大值。 例如:

我应该9点回来

更新1

我正在学习递归函数,这是本书中的练习,没有答案。我觉得可以在这里问,但似乎这不是一个好主意。好吧,我没有写任何代码示例,所以它似乎是一个懒惰的家伙的家庭作业练习。无论如何,这是我最好的尝试:

let rec highest l = 
    match l with 
    |[] -> 0 
    |x::y::xs -> if x > y then highest x::xs
                 else highest y::xs 

但这不起作用。我不能使用F#函数,这当然是为了学习。很抱歉,如果让你耽误了一些时间,谢谢你的帮助。

在回答之前:这个问题很奇怪,Stackoverflow可能不是最好的地方

  • 如果是生产代码,请使用
    List.max
    。(撇开双关语不谈,递归并不是它自己的回报…)
  • 如果是为了家庭作业,试着理解递归,而不是把你的练习委托给互联网上随机的人
  • 如果这是一个拼图/代码高尔夫,这是错误的网站,它可以更清楚的要求是什么
无论如何,这可以通过张贴来回答,并满足以下要求:

  • 解决方案是尾部递归的,而不仅仅是递归的。显然,我不想编写一个函数来替换
    List.max
    ,而只是为了不必要地增加堆栈
  • 问题代码中调用的函数
    maxist
    直接是递归函数,不获取额外参数。如果我逐字逐句地回答这个问题,这似乎是一个要求,所以我不允许使用累加器
。因此,这需要一个自定义实现:

let rec biggest = function
    | h1 :: h2 :: t -> biggest ((max h1 h2) :: t)
    | [result] -> result
    | [] -> failwith "list empty"

这是一个非常奇怪的解决方案,但它能满足要求,并且适用于长列表。

在回答之前:这个问题很奇怪,Stackoverflow可能不是最好的解决方案

  • 如果是生产代码,请使用
    List.max
    。(撇开双关语不谈,递归并不是它自己的回报…)
  • 如果是为了家庭作业,试着理解递归,而不是把你的练习委托给互联网上随机的人
  • 如果这是一个拼图/代码高尔夫,这是错误的网站,它可以更清楚的要求是什么
无论如何,这可以通过张贴来回答,并满足以下要求:

  • 解决方案是尾部递归的,而不仅仅是递归的。显然,我不想编写一个函数来替换
    List.max
    ,而只是为了不必要地增加堆栈
  • 问题代码中调用的函数
    maxist
    直接是递归函数,不获取额外参数。如果我逐字逐句地回答这个问题,这似乎是一个要求,所以我不允许使用累加器
。因此,这需要一个自定义实现:

let rec biggest = function
    | h1 :: h2 :: t -> biggest ((max h1 h2) :: t)
    | [result] -> result
    | [] -> failwith "list empty"

这是一个非常奇怪的解决方案,但它满足了要求,并且适用于长列表。

经过几天的思考,在学校的帮助下,我想出了这个解决方案,这是Vandroy的另一个解决方案:

let rec max_value l =
    match l with
    |[] -> []
    |[x] -> [x]
    |(x::y::xs) ->  if x<y then max_value (y::xs)
                    else max_value (x::xs)
let rec max_value l=
匹配
|[] -> []
|[x] ->[x]

|(x::y::xs)->如果x经过几天的思考,在学校的帮助下,我想出了这个,这是Vandroy的另一个解决方案:

let rec max_value l =
    match l with
    |[] -> []
    |[x] -> [x]
    |(x::y::xs) ->  if x<y then max_value (y::xs)
                    else max_value (x::xs)
let rec max_value l=
匹配
|[] -> []
|[x] ->[x]


|(x::y::xs)->如果这是家庭作业,请在问题中注明。否则回答的人就没有正确的上下文。为什么应该是递归的呢?List.max做你想做的事情。@hvester可能是因为那是家庭作业。@MarkSeemann我正在学习F#中的递归函数,并尝试了很多东西,我想这是最好的
让rec highest l=
将l与
[]->0
|x::y::xs->如果x>y,则最高的x::xs
否则最高的y::xs
但不work@FyodorSoikin这是一个从书中学习递归的练习,但没有解决方案,感谢tipIf这是家庭作业,请在问题中注明。否则回答的人就没有正确的上下文。为什么应该是递归的呢?List.max做你想做的事情。@hvester可能是因为那是家庭作业。@MarkSeemann我正在学习F#中的递归函数,并尝试了很多东西,我想这是最好的
让rec highest l=
将l与
[]->0
|x::y::xs->如果x>y,则最高的x::xs
否则最高的y::xs
但不work@FyodorSoikin学习递归是本书中的一个练习,但没有解决方案,谢谢你为什么不使用带累加器的内部函数来满足“签名要求”不必“怪异”?@vandroy你的代码就是我想要的,我很接近你的答案,但我的代码有点不对劲。我只是在学习递归,不想在互联网上打扰人们,如果我和你一起做了,我的借口。多谢各位much@Sehnsucht那可能是作弊。问题中调用的函数应该是递归的,而不是由它调用的函数。无论如何,递归的要求是任意的,因此更严格的规则也可能是正确的。因此,我当然使用最严格的解释:P@Seb不用担心,我不觉得烦恼;我只是想确定我的答案利大于弊。Stackoverflow有时会提出一些问题,这些问题看起来像是试图缩短理解,让某些东西“起作用”。当然我不知道你的意图,我只是想建议你关注“为什么”的问题和概念,而不是具体的解决方案。祝你学习顺利!你为什么不使用一个带累加器的内部函数来满足“签名要求”,而不必“很奇怪”?@Vandroy你的代码就是我们要找的,我很接近你的答案,但我的代码有点错误。我是