Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
List 按F中的索引n剪切列表#_List_F#_F# 3.0_F# Scripting - Fatal编程技术网

List 按F中的索引n剪切列表#

List 按F中的索引n剪切列表#,list,f#,f#-3.0,f#-scripting,List,F#,F# 3.0,F# Scripting,尝试编写一个递归函数,将列表减少n。然后返回2个列表。所以如果我通过 cut(2, [5;10;4;2;7]);; val it : int list * int list = ([5; 10], [4; 2; 7]) 我想买那样的东西 let rec cut (n, xs) = match n, xs with | 0, xt -> (n, xs) | n, x::xt -> cut(n, xt), xs;; 请帮忙 最好

尝试编写一个递归函数,将列表减少n。然后返回2个列表。所以如果我通过

cut(2, [5;10;4;2;7]);;
  val it : int list * int list = ([5; 10], [4; 2; 7])
我想买那样的东西

let rec cut (n, xs) = 
        match n, xs with 
        | 0, xt -> (n, xs)
        | n, x::xt -> cut(n, xt), xs;;

请帮忙

最好将列表或序列上的内置函数结合起来,以实现这一点:

let cut' (n, xs) =
    Seq.take n xs, Seq.skip n xs
递归地,您的函数可以这样定义:

let cut (n, xs) =
    let rec aux = function
        | 0, xs, ys -> xs, ys
        | n, xs, y :: ys -> aux (n - 1, y :: xs, ys)
        | _ -> failwith "invalid arguments"
    let l, r = aux (n, [], xs)
    (List.rev l, r)

最好将列表或序列上的内置函数结合起来以实现这一点:

let cut' (n, xs) =
    Seq.take n xs, Seq.skip n xs
递归地,您的函数可以这样定义:

let cut (n, xs) =
    let rec aux = function
        | 0, xs, ys -> xs, ys
        | n, xs, y :: ys -> aux (n - 1, y :: xs, ys)
        | _ -> failwith "invalid arguments"
    let l, r = aux (n, [], xs)
    (List.rev l, r)

我将解释@MisterMetaphors递归函数

cut函数不是递归的,但是aux是,它通过从n开始倒数并从传递给cut的列表的头部删除元素来工作

假设您这样称呼cut
cut2[3;4;5;7;8]
。aux是一个模式匹配函数,包含三个参数:n、分区1、分区2。分区1以空列表开始,分区2以传递给cut的完整列表开始

第一次aux将匹配第二个子句,然后它将使用参数(1、[3]、[4;5;7;8])调用自己。下次它还将匹配第二个子句,现在它将自己称为(0,[4;3],[5;7;8])。第三次也是最后一次匹配第一个子句(n=0),它将返回一个包含xs和ys的元组

但是请注意,xs的元素顺序相反,因为每个元素都是在前面加上前缀的(使用cons运算符::)。之所以这样做是因为它是一个O(1)操作,而append操作符@在左侧是O(n)

因为xs的顺序是相反的,所以函数中的最后一个表达式是xs的反转

另一种稍微简短的定义可以是:

let cut n xs =
    let rec aux = function
        | 0, xs, ys -> List.rev xs, ys
        | n, xs, y :: ys -> aux (n - 1, y :: xs, ys)
        | _ -> failwith "invalid arguments"
    aux (n, [], xs)

我将解释@MisterMetaphors递归函数

cut函数不是递归的,但是aux是,它通过从n开始倒数并从传递给cut的列表的头部删除元素来工作

假设您这样称呼cut
cut2[3;4;5;7;8]
。aux是一个模式匹配函数,包含三个参数:n、分区1、分区2。分区1以空列表开始,分区2以传递给cut的完整列表开始

第一次aux将匹配第二个子句,然后它将使用参数(1、[3]、[4;5;7;8])调用自己。下次它还将匹配第二个子句,现在它将自己称为(0,[4;3],[5;7;8])。第三次也是最后一次匹配第一个子句(n=0),它将返回一个包含xs和ys的元组

但是请注意,xs的元素顺序相反,因为每个元素都是在前面加上前缀的(使用cons运算符::)。之所以这样做是因为它是一个O(1)操作,而append操作符@在左侧是O(n)

因为xs的顺序是相反的,所以函数中的最后一个表达式是xs的反转

另一种稍微简短的定义可以是:

let cut n xs =
    let rec aux = function
        | 0, xs, ys -> List.rev xs, ys
        | n, xs, y :: ys -> aux (n - 1, y :: xs, ys)
        | _ -> failwith "invalid arguments"
    aux (n, [], xs)

你能解释一下递归解决方案吗?我想学习。@MarkNinja看看Simon Skov Boisen的另一个答案,它有一个很好的解释。你能解释一下递归解吗?我想学习。@MarkNinja看到Simon Skov Boisen的另一个答案,它有一个很好的解释。很好!顺便说一句,
cut
不是递归的,所以你可以从声明中删除
rec
。呵呵,是的,你说得对,我刚刚注意到并更新了我的答案。这就是我从复制/粘贴中得到的:-)很好!顺便说一句,
cut
不是递归的,所以你可以从声明中删除
rec
。呵呵,是的,你说得对,我刚刚注意到并更新了我的答案。这就是我从复制/粘贴中得到的:-)记住接受答案。我理解学习的愿望,但是@MisterMetaphor的答案和内置函数是更好的方法。使用内置函数编写代码更容易,其他开发人员以后也更容易阅读。记住接受答案。我理解学习的愿望,但@mistermataphor使用内置函数的答案是更好的方法。使用内置函数编写代码更容易,其他开发人员以后阅读也更容易。