【问题标题】:F# define search functionF# 定义搜索功能
【发布时间】:2020-06-21 02:15:27
【问题描述】:

我是 F# 新手,我的代码有问题。定义一个函数 search 是一个简单的问题,它接受一个布尔函数和一个列表并返回一个索引。比如:

> search (fun x -> x > 10) [ 2; 12; 3; 23; 62; 8; 2 ];;
val it : int = 1

> search (fun s -> s < "horse") [ "pig"; "lion"; "horse"; "cow"; "turkey" ];;
val it : int = 3

我现在找到了正确的匹配项,但我不知道如何返回一个数字而不是列表的其余部分。我知道我得到的是列表而不是返回值,因为我写了“if f head then list”。我不知道我应该放什么,或者我所拥有的不会得到我想要的结果。

下面是我写的代码。

let rec search f list =
    match list with
        | [] -> [-1]
        | head::tail ->
            if f head then list
            else search f tail

【问题讨论】:

    标签: recursion search functional-programming f# boolean


    【解决方案1】:

    返回一个数字很容易,您只需...返回它。您的问题是您没有要返回的数字,因为您不能直接从当前状态派生它。你必须自己跟踪这个数字,使用一些内部状态变量。

    使用递归时,您可以通过使用“修改过的”参数递归调用函数来更改状态。您已经使用此处的列表执行此操作。要在递归函数中保持内部状态,您必须引入另一个参数,但不要将其暴露在外部。您可以通过使用内部递归辅助函数来解决这个问题。这是一个跟踪前一个项目并在遇到匹配时返回它的项目:

    let search f list =
        let rec loop list prev =
            match list with
                | [] -> None
                | head::tail ->
                    if f head then prev
                    else loop tail (Some head)
        in
        loop list None
    

    这是一个愚蠢的例子,但我不想只是为你解决你的作业,因为那样你就不会学到任何东西。使用它,您应该能够弄清楚如何保持当前项目所在位置的计数器,并在匹配时返回。祝你好运!

    【讨论】:

      【解决方案2】:

      您通常定义一个内部递归函数来帮助您在循环时携带状态,然后使用初始状态调用内部函数。

         let search predicate list =
          let rec loop list index =
              match list with
                  | [] -> -1
                  | head::tail ->
                      if predicate head then index
                      else loop tail (index + 1)
          loop list 0
      

      【讨论】:

        猜你喜欢
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-03
        • 2012-03-03
        • 2014-04-15
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多