List F#:在非空列表中查找较大值的递归函数
我需要一个F#中的递归函数,它给我一个非空列表的最大值。 例如: 我应该9点回来 更新1 我正在学习递归函数,这是本书中的练习,没有答案。我觉得可以在这里问,但似乎这不是一个好主意。好吧,我没有写任何代码示例,所以它似乎是一个懒惰的家伙的家庭作业练习。无论如何,这是我最好的尝试: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
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你的代码就是我们要找的,我很接近你的答案,但我的代码有点错误。我是