1

我需要 F# 中的递归函数,它为我提供了非空列表的最大价值。例子:

biggest [2;4;5;3;9;3] 

应该返回 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# 函数,这当然是为了学习目的。很抱歉,如果让您失去了一些时间,并感谢您的帮助。

4

2 回答 2

3

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

  • 如果是用于生产代码,请使用List.max. (双关语,递归不是它自己的奖励......)
  • 如果是为了家庭作业,请尝试理解递归,而不是将您的练习委托给互联网上的随机人员。
  • 如果是拼图/代码高尔夫,这是错误的站点,可能会更清楚要求是什么。

无论如何,这可以按照发布的方式回答,具有以下要求:

  • 解决方案是尾递归的,而不仅仅是递归的。显然我不想编写一个函数来替换List.max只是为了不必要地增加堆栈。
  • biggest问题代码中调用的函数直接是递归函数,没有额外的参数。如果我从字面上理解这个问题,这似乎是一个要求,所以我不允许使用累加器。

List.max是用变异循环实现的,因此不符合条件(链接到 F# 源代码)。所以这需要一个自定义实现:

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

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

于 2016-11-01T16:00:07.453 回答
1

经过几天的思考并在学校的一些帮助下,我想出了这个,这是 Vandroiy 的替代解决方案:

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)

多谢

于 2016-11-04T23:01:08.763 回答