List 在F中递归地附加列表#
定义一个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#方法(示例:@)!
例如:
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)
。