为什么我的concat列表顺序错误?

时间:2014-06-02 15:17:45

标签: list f# functional-programming tail-recursion

我试图让一个示例函数尾递归。 这是原始功能:

let rec s xs ys =
    match (xs, ys) with
    |([],[]) -> []
    |(xs, []) -> xs
    |([], ys) -> ys
    |(x::xs,y::ys) -> x::y::s xs ys

以下是我尝试使其递归递归:

let sC xs ys =
    let rec sCTR xs ys acc =
        match (xs, ys) with
        |([],[]) -> acc
        |(xs, []) -> acc@xs
        |([], ys) -> acc@ys
        |(x::xs,y::ys) -> sCTR xs ys acc@[x]@[y]

    sCTR xs ys []

然而,我的问题是项目的顺序都是错误的。 当我在第一个函数中输入列表[1; 2; 3;] [7; 8;]时,得到结果[1; 7; 2; 8; 3] 但是当我在第二个函数中输入[1; 2; 3;] [7; 8;]时,我得到[3; 2; 8; 1; 7]

为什么订单错了?我认为list1 @ list2会产生一个新列表,首先是list1元素的顺序,然后是list2元素

1 个答案:

答案 0 :(得分:4)

你刚刚假设@的错误优先顺序;你得到的东西被解释为

(sCTR xs ys acc)@[x]@[y]

但你想要的是

sCTR xs ys (acc@[x]@[y])