Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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

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中递归地附加列表#_List_F#_Append - Fatal编程技术网

List 在F中递归地附加列表#

List 在F中递归地附加列表#,list,f#,append,List,F#,Append,定义一个F#函数将两个列表合并到一个列表中 一个。我不允许在列表中使用标准F#方法(示例:@)! 例如: AppendManually [1; 3; 5] [7] 应该回来 int list=[1;3;5;7] .我相信List.append是最方便的方式。如果您不想使用它,您可以随时将一个列表折叠到另一个列表上,单独添加元素 let a =[1; 3; 5] let b =[7] b |> List.foldBack (fun e acc-> e :: acc) a 我把它

定义一个F#函数
将两个列表合并到一个列表中
一个。我不允许在列表中使用标准F#方法(示例:@)!
例如:

 AppendManually [1; 3; 5] [7]
应该回来

int list=[1;3;5;7]


.

我相信List.append是最方便的方式。如果您不想使用它,您可以随时将一个列表折叠到另一个列表上,单独添加元素

let a =[1; 3; 5]
let b =[7]
b |> List.foldBack (fun e acc->  e :: acc) a
我把它整理好了:

let rec AppendManually list1 list2= 
  match list1,list2 with
  | [],l | l,[] -> l
  | x::list1', y::list2' -> 
     if x < y then x :: (AppendManually list1' list2) 
     else y :: (AppendManually list1 list2')    
let rec AppendManually list1 list2=
将列表1、列表2与
|[],l | l,[]->l
|x::list1',y::list2'->
如果x
我想是典型的学员问题……让我们创建一个典型的学员答案,不要使用任何库函数:

let AppendManually l1 l2 =
    let rec rev acc = function
        | [] -> acc
        | x :: xs -> rev (x :: acc) xs
    rev [] (rev (rev [] l1) l2)
它是如何工作的?由于我们不能附加到列表的末尾,只能在开头加上前缀,因此我们创建了一个helper函数
rev
,该函数包含两个列表,并将在第二个列表从头到尾循环,将所有元素预加到第一个列表。一旦第二个列表为空,第一个列表将按相反顺序包含所有元素


然后按如下方式使用此函数:按相反顺序将第一个列表的元素前置为空列表;按照与第一次调用的结果相反的顺序预先添加第二列表的元素;最后,以与空列表相反的顺序再次将结果前置。

您所说的“列表上的标准F#方法”是什么意思?您可以使用
折叠功能吗?我只能在没有其他选项的情况下使用::。这是家庭作业吗?到目前为止,您尝试了什么?如果x
,为什么有
?作业是否也告诉您这两个列表应该按排序顺序结束?因为如果你只是想附加两个列表,那会得到错误的结果。考虑这一点:<代码> AppDead手动[ 1;3;5 ] [2;4;6 ] < /代码>返回?你的函数将返回
[1;2;3;4;5;6]
,但是如果你只是附加而不是排序,那么正确的答案应该是
[1;3;5;2;4;6]
。此外,这个答案不是尾部递归的,并且会在一个包含堆栈溢出的大列表中失败。你可以简单地做:
l1 |>rev[]>rev l2
或:
rev l2(rev[]l1)
而不是:
rev[](rev(rev[]l1)l2)