【问题标题】:F#: recursive function to find bigger value in non empty listF#:递归函数在非空列表中找到更大的值
【发布时间】:2017-03-14 17:12:26
【问题描述】:

我需要一个 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# 函数,这当然是为了学习目的。非常抱歉,如果让您失去了一些时间,并感谢您的帮助。

【问题讨论】:

  • 如果这是作业,请在问题中注明。否则回答的人没有正确的上下文。
  • 为什么要递归? List.max 做你想做的事。
  • @hvester 可能是因为这是家庭作业。
  • @MarkSeemann 我正在 F# 中学习递归函数并尝试了很多东西,我想这是最好的 let rec highest l = match l with [] -> 0 |x::y::xs -> if x>y then highest x::xs else highest y::xs 但不起作用
  • @FyodorSoikin 这是本书中学习递归的练习,但没有解决方案,谢谢提示

标签: list recursion f# highest


【解决方案1】:

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

  • 如果是生产代码,请使用List.max。 (顺便说一句,递归并不是它自己的奖励......)
  • 如果是为了家庭作业,请尝试了解递归,而不是将您的练习委托给互联网上的随机人员。
  • 如果是拼图/密码高尔夫,这是错误的网站,要求更清楚。

无论如何,这个可以回复为已发布,但有以下要求:

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

List.max is implemented with a mutating loop and therefore doesn't qualify (link goes to F# source code)。所以这需要一个自定义实现:

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

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

【讨论】:

  • 你为什么不使用带有累加器的内部函数来满足“签名要求”而不必“变得怪异”?
  • @Vandroiy 您的代码正是您要找的,我接近您的答案,但我的代码有问题。我只是在学习递归,不想在互联网上打扰别人,如果我和你一起做,我的借口。非常感谢
  • @Sehnsucht 这可能是作弊。问题中调用的函数应该是递归的,而不是被它调用的函数。无论如何,递归的要求是任意的,所以更严格的规则也可能是正确的。所以我当然使用最严格的解释。 :P
  • @Seb 不用担心,我不觉得打扰;我只是想确定我的回答是利大于弊。 Stackoverflow 有时会出现一些问题,这些问题看起来像是在尝试理解捷径,只是让某些东西“工作”。当然我不知道你的意图,我只是想建议关注“为什么”的问题和概念,而不是具体的解决方案。祝您学习顺利!
【解决方案2】:

经过几天的思考并在学校的一些帮助下我想出了这个,这是 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)

非常感谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多