Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 比较列表F中子列表的长度#_F# - Fatal编程技术网

F# 比较列表F中子列表的长度#

F# 比较列表F中子列表的长度#,f#,F#,我是F#的新手,目前正在研究一个问题,我试图比较列表中子列表的长度,并返回一个布尔值 如果任何子列表为空,程序也应该返回“false”。然而,随着我的进步,我一直无法解决我目前的问题,尽管我不知怎么地发现了问题所在(这与我迄今为止在F#语言方面的经验有关)。希望有人能帮我一把,这样我就能很快进入下一个项目 我目前的计划如下: let projectOne (initList: int list list) = let mutable lst = initList.[0].Length let m

我是F#的新手,目前正在研究一个问题,我试图比较列表中子列表的长度,并返回一个布尔值

如果任何子列表为空,程序也应该返回“false”。然而,随着我的进步,我一直无法解决我目前的问题,尽管我不知怎么地发现了问题所在(这与我迄今为止在F#语言方面的经验有关)。希望有人能帮我一把,这样我就能很快进入下一个项目

我目前的计划如下:

let projectOne (initList: int list list) =
let mutable lst = initList.[0].Length
let mutable lst1 = ""
let n = initList.Length
for i=1 to n-1 do
    if lst = 0 || initList.[i].Length = 0 then
        lst1 <- "false"
    elif lst <> initList.[i].Length then
        lst1 <- "false"
    elif
        lst = initList.[i].Length then 
        lst1 <- "true"
lst1

printfn "The sublists are of same lenght: %A" (projectOne [[1;2;3;4];[4;5;6];[6;7;8;9];[5;6;7;8]])
let projectOne(initList:int list)=
设可变lst=initList[0]。长度
让可变lst1=“”
设n=initList.Length
对于i=1到n-1 do
如果lst=0 | | initList[i].Length=0,则

lst1考虑这一点的一个更实用的方法是

  • 如果所有子列表都为空,则它们的长度都相同
  • 否则,如果任何子列表为空,则它们的长度不相同
  • 否则,如果列表的尾部都相同,则列表的长度都相同
  • 例如:

    let rec projectOne initList =
        if List.forall List.isEmpty initList then
            true
        else if List.exists List.isEmpty initList then
            false
        else
            projectOne (List.map List.tail initList)
    
    下面是另一个例子:

    let projectOne lst =
        match lst with
        | h::t -> t |> List.forall(fun (l:_ list) -> l.Length = h.Length)
        | _    -> true
    

    对代码的简单修复可以是:

    let projectOne (initList: int list list) =
        let length = initList.[0].Length
        let mutable result = length <> 0
        let n = initList.Length
    
        for i=1 to n-1 do
            result <- result && initList.[i].Length = length
    
        result
    
    let haveEqualLength lists =
        let length = lists |> List.head |> List.length
        length <> 0 && lists |> List.tail |> List.tryFind (fun l -> l.Length <> length) = None
    
    let projectOne(initList:int list)=
    让length=initList[0]。length
    让可变结果=长度0
    设n=initList.Length
    对于i=1到n-1 do
    结果List.head |>List.length
    长度0&&lists |>List.tail |>List.tryFind(有趣的l->l.length长度)=无
    
    啊,这很有道理,谢谢!仍然在尝试将我的思维功能化,以一种聪明的方式来处理这些问题。@KenLar-这种方法的另一个好特性是
    List.isEmpty
    List.tail
    都是O(1)和
    List.forall
    List.exists
    都是短路(
    List.forall
    在检测到一个与条件不匹配的项时返回false,
    List.exists
    在检测到一个与条件匹配的项时返回true)。因此此函数尽可能少地计算出答案。非常感谢您的回答:-)一段时间后,我用几种方法对它进行了分类。很高兴看到人们在这里花点时间帮忙!非常感谢你的回答:-)一段时间后,我用几种方法对它进行了排序。很高兴看到人们在这里花点时间帮忙!